使用 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”和一些其他的东西都没有用。

是的,我已将其修改为可执行文件...

感觉应该这么简单

我试过其他帖子和整个网络上的建议都无济于事。

问题:

感谢您的帮助;

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

解决这个问题:

  1. 转到 newspaper 库中的 settings.py 文件。
  2. 编辑变量 DATA_DIRECTORY = '.newspaper_scraper' 并将其更改为 DATA_DIRECTORY = '.path/to/writable/directory'
  3. 保存文件,您就可以开始了。

我不知道为什么它没有返回本可以更早解释这一点的错误。

希望这对其他人有帮助。

非常感谢 Sergey Vasilyev 的帮助。非常感谢。