python - 使用 EC2 实例上的虚拟环境从浏览器运行 Python 脚本
问题描述
TLDR;
我在我的 EC2 实例上创建了一个虚拟环境。如何从浏览器访问它?
嘿大家,
我按照本教程在我的 EC2 实例上创建了一个虚拟环境来运行一个简单的 Python 脚本。在终端内,它可以正常工作。但是,我已经制作了一个 Web 应用程序,我想使用虚拟环境从浏览器中激活这个脚本。当我尝试这个时,我收到“权限被拒绝”错误。
PHP
$output=shell_exec('bash /var/app/current/scripts/script.sh');
echo "<pre>$output</pre>";
脚本.sh
#!/bin/bash
source /home/ec2-user/venv/python3/bin/activate
python3 /var/app/current/scripts/test.py
测试.py
from datetime import datetime
from bs4 import BeautifulSoup
import requests
print('hello')
print(datetime.now())
url = "https://www.stackoverflow.com/"
website = requests.get(url).text
soup = BeautifulSoup(website, "html.parser")
print(soup.title)
错误
/var/app/current/scripts/script.sh: line 2: /home/ec2-user/venv/python3/bin/activate: Permission denied
Traceback (most recent call last):
File "/var/app/current/scripts/test.py", line 2, in <module>
from bs4 import BeautifulSoup
ModuleNotFoundError: No module named 'bs4'
我试过的:
我尝试使用以下方法更改虚拟环境的权限:
chmod a+x /home/ec2-user/venv
这应该使所有用户都可以访问虚拟环境文件夹:/home/ec2-user/venv
但是,我仍然收到错误消息:
/home/ec2-user/venv/python3/bin/activate: Permission denied
我还尝试让所有用户都可以执行激活脚本(/home/ec2-user/venv/python3/bin/activate):
chmod 665 /home/ec2-user/venv/python3/bin/activate
结果是:
-rw-rw-r-x 1 ec2-user ec2-user /home/ec2-user/venv/python3/bin/activate
但是,我仍然遇到同样的错误:
/home/ec2-user/venv/python3/bin/activate: Permission denied
笔记:
- 请注意,如果我只导入 datetime 并注释掉 bs4 和 requests(以及关于 BeautifulSoup 的所有其他内容),那么该脚本可以很好地工作,因为它不必访问虚拟环境来拉入包。
解决方案
您收到此错误是因为您尚未将 python 脚本中使用的库添加到虚拟环境中。
在您提到的教程中,只安装了 boto 库。
您需要安装您使用的库。从命令行运行:
source /home/ec2-user/venv/python3/bin/activate
pip install beautifulsoup4
pip install requests
或者,您可以创建一个文件并为其命名,/home/ec2-user/requirements.txt
例如并列出您的脚本使用的所有要求:
beautifulsoup4
requests
然后您可以使用此文件将所有要求安装到虚拟环境中:
source /home/ec2-user/venv/python3/bin/activate
pip install -r /home/ec2-user/requirements.txt
推荐阅读
- jenkins - jenkins 管道在 sh 后退出
- python - Selenium chrome webdriver无法在python中定位元素
- visual-studio-code - 即使打开不同文件夹中的文件,VSCode 是否可以始终打开默认文件夹(用于 Ctrl + P 搜索)?
- react-native - FlatList 不会向下滚动到最后
- javascript - 来自正则表达式的 exec 返回 null
- java - 上面许多目录中的 Java 源代码
- html - 将 IMG 元素用于标题徽标或背景图像是否更好,为什么?
- sql - bash 中的简单 sql 脚本失败
- javascript - 从节点中不存在的路由重定向?
- laravel - 自定义时间戳在 $model->save() 上复制 updated_at