使用 PHP 调用 Virtualenv 的 Python 脚本
Using PHP to call Virtualenv’ed Python Script
昨晚我花了 5.5 个小时尝试使 PHP 执行并接收 Virtualenv 的 Python 脚本的输出。什么都没用;除了没有 Virtualenv 的脚本。
我想做什么:
我正在尝试 PHP 在调用时调用 Newspaper lib 输出文本的 virtualenv 安装。
我现在拥有的:
PHP:(更新)
<?php
$output = exec('newspaper2/bin/python3 /var/www/html/components/python/test.py 2>&1', $output2);
print_r(error_get_last());
echo $output2;
echo $output;
…这在使用非虚拟环境脚本时有效
Python:(更新)
from newspaper import Article
url = 'http://example.com/'
article = Article(url)
article.download()
article.html
article.parse()
article.authors
article.publish_date
string = article.text
print(string)
问题是什么:
我可以从命令行 运行 PHP 运行ning 的脚本,它输出得很好。
我试过的:
使用 PHP,(我已经尝试了 PHP 的所有“exec”调用)它似乎无法打开虚拟环境并且 returns 什么都没有。
在脚本之前我调用了“python3”和一些其他的东西都没有用。
是的,我已将其修改为可执行文件...
感觉应该这么简单
我试过其他帖子和整个网络上的建议都无济于事。
问题:
- 我是不是设置错了virtualenv?
- 在 Python 脚本的顶部,我应该调用其他东西而不是“#!/usr/bin/env python3”吗?
- 如果有,我在哪里可以找到它?我应该从头开始吗?
有帮助吗?
感谢您的帮助;
PS:我是运行ning Ubuntu16,PHP7,我需要使用Python3
在 virtualenv 的脚本中(即通过安装工具的入口点安装),你不应该触及 shebang(#!...
第一行)。它由 virtualenv & setuptools & 相关工具填充。
如果您指定自己的 shebang,则它不是 virtualenv'ed 脚本。那样的话,直接调用python:
exec('/path/to/venv/bin/python3 /var/www/html/components/python/testing.py');
或者,您可以将 virtualenv 的 python 二进制文件的绝对路径放入 py 脚本,但这看起来不是个好主意。
此外,请记住 virtualenvs 是不可重定位的。所以他们应该留在创建它们的路径上。
另请注意,exec()
returns 仅输出最后一行。您可能希望 shell_exec()
或 exec('...', $output)
获得整个输出。
此外,不清楚您的脚本发生了什么,以及在 stderr 上打印了什么。试试这个命令看看错误是什么:
exec('/path/to/script 2>&1', $output)
#OR:
exec('/path/to/venv/bin/python3 /path/to/script 2>&1', $output)
好吧,我终于想通了,在这个过程中学到了很多东西。我默认使用的 newspaper
库尝试写入用户主目录的基础。在本例中,它试图写入 www-data
、/var/www
。
解决这个问题:
- 转到
newspaper
库中的 settings.py
文件。
- 编辑变量
DATA_DIRECTORY = '.newspaper_scraper'
并将其更改为 DATA_DIRECTORY = '.path/to/writable/directory'
- 保存文件,您就可以开始了。
我不知道为什么它没有返回本可以更早解释这一点的错误。
希望这对其他人有帮助。
非常感谢 Sergey Vasilyev 的帮助。非常感谢。
昨晚我花了 5.5 个小时尝试使 PHP 执行并接收 Virtualenv 的 Python 脚本的输出。什么都没用;除了没有 Virtualenv 的脚本。
我想做什么:
我正在尝试 PHP 在调用时调用 Newspaper lib 输出文本的 virtualenv 安装。
我现在拥有的:
PHP:(更新)
<?php
$output = exec('newspaper2/bin/python3 /var/www/html/components/python/test.py 2>&1', $output2);
print_r(error_get_last());
echo $output2;
echo $output;
…这在使用非虚拟环境脚本时有效
Python:(更新)
from newspaper import Article
url = 'http://example.com/'
article = Article(url)
article.download()
article.html
article.parse()
article.authors
article.publish_date
string = article.text
print(string)
问题是什么:
我可以从命令行 运行 PHP 运行ning 的脚本,它输出得很好。
我试过的:
使用 PHP,(我已经尝试了 PHP 的所有“exec”调用)它似乎无法打开虚拟环境并且 returns 什么都没有。
在脚本之前我调用了“python3”和一些其他的东西都没有用。
是的,我已将其修改为可执行文件...
感觉应该这么简单
我试过其他帖子和整个网络上的建议都无济于事。
问题:
- 我是不是设置错了virtualenv?
- 在 Python 脚本的顶部,我应该调用其他东西而不是“#!/usr/bin/env python3”吗?
- 如果有,我在哪里可以找到它?我应该从头开始吗? 有帮助吗?
感谢您的帮助;
PS:我是运行ning Ubuntu16,PHP7,我需要使用Python3
在 virtualenv 的脚本中(即通过安装工具的入口点安装),你不应该触及 shebang(#!...
第一行)。它由 virtualenv & setuptools & 相关工具填充。
如果您指定自己的 shebang,则它不是 virtualenv'ed 脚本。那样的话,直接调用python:
exec('/path/to/venv/bin/python3 /var/www/html/components/python/testing.py');
或者,您可以将 virtualenv 的 python 二进制文件的绝对路径放入 py 脚本,但这看起来不是个好主意。
此外,请记住 virtualenvs 是不可重定位的。所以他们应该留在创建它们的路径上。
另请注意,exec()
returns 仅输出最后一行。您可能希望 shell_exec()
或 exec('...', $output)
获得整个输出。
此外,不清楚您的脚本发生了什么,以及在 stderr 上打印了什么。试试这个命令看看错误是什么:
exec('/path/to/script 2>&1', $output)
#OR:
exec('/path/to/venv/bin/python3 /path/to/script 2>&1', $output)
好吧,我终于想通了,在这个过程中学到了很多东西。我默认使用的 newspaper
库尝试写入用户主目录的基础。在本例中,它试图写入 www-data
、/var/www
。
解决这个问题:
- 转到
newspaper
库中的settings.py
文件。 - 编辑变量
DATA_DIRECTORY = '.newspaper_scraper'
并将其更改为DATA_DIRECTORY = '.path/to/writable/directory'
- 保存文件,您就可以开始了。
我不知道为什么它没有返回本可以更早解释这一点的错误。
希望这对其他人有帮助。
非常感谢 Sergey Vasilyev 的帮助。非常感谢。