使用 PHP 调用 Virtualenv 的 Python 脚本

reg*_*or2 6 php python virtualenv ubuntu-16.04

昨晚我花了 5.5 个小时尝试让 PHP 执行并接收 Virtualenv\xe2\x80\x99ed Python 脚本的输出。没有任何效果;除了不是 Virtualenv\xe2\x80\x99ed 的脚本。

\n\n

我正在尝试做的事情:

\n\n

当我调用它时,我试图让 PHP 调用报纸库输出文本的 virtualenv\xe2\x80\x99d 安装。

\n\n

我现在拥有的:

\n\n

PHP:(已更新)

\n\n
<?php\n$output = exec('newspaper2/bin/python3 /var/www/html/components/python/test.py 2>&1', $output2);\nprint_r(error_get_last());\necho $output2;\necho $output;\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa6这在使用非 virtualenv 脚本时有效

\n\n

Python:(更新)

\n\n
from newspaper import Article\nurl = 'http://example.com/'\narticle = Article(url)\narticle.download()\narticle.html\narticle.parse()\narticle.authors\narticle.publish_date\nstring = article.text\nprint(string)\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题是什么:

\n\n

我可以从命令行运行 PHP 正在运行的脚本,并且它输出得很好。

\n\n

我尝试过的:

\n\n

使用 PHP,(我已经尝试了 PHP 的所有 \xe2\x80\x9cexec\xe2\x80\x9d 调用)它似乎无法打开虚拟环境并且没有返回任何内容。

\n\n

在脚本之前,我调用了 \xe2\x80\x9cpython3\xe2\x80\x9d 和其他一些无济于事的东西。

\n\n

是的,我已将其 chmod 为可执行\xe2\x80\xa6

\n\n

我感觉这件事应该很简单。

\n\n

我已经尝试过其他帖子和整个网络的建议,但无济于事。

\n\n

问题:

\n\n
    \n
  • 我是否设置了 virtualenv 错误?
  • \n
  • 在Python脚本的顶部,我应该调用其他东西而不是\xe2\x80\x9c#!/usr/bin/env python3\xe2\x80\x9d吗?
  • \n
  • 如果是这样,我在哪里可以找到它?我应该从头开始吗?\n这会有帮助吗?
  • \n
\n\n

感谢您的帮助;

\n\n

PS:我运行的是Ubuntu16,PHP7,我需要使用Python3

\n

Ser*_*yev 5

在 virtualenv'ed 脚本中(即通过 setuptools 的入口点安装),您不应触摸 shebang(#!...第一行)。它由 virtualenv 和 setuptools 及相关工具填充。

如果您指定自己的 shebang,那么它不是 virtualenv'ed 脚本。在这种情况下,直接调用 python:

exec('/path/to/venv/bin/python3 /var/www/html/components/python/testing.py');
Run Code Online (Sandbox Code Playgroud)

或者,您可以将 virtualenv 的 python 二进制文件的绝对路径放入 py 脚本中,但这看起来不是一个好主意。

另外,请记住 virtualenv 是不可重定位的。所以他们应该留在他们被创造的道路上。

另请注意,exec()仅返回输出的最后一行。您可能想要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)
Run Code Online (Sandbox Code Playgroud)


reg*_*or2 1

好吧,我终于想通了,并且在这个过程中学到了很多东西。我默认使用的库newspaper尝试写入用户主目录的基础。在本例中,它尝试写入www-data, /var/www

要解决此问题:

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

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

希望这对其他人有帮助。

非常感谢谢尔盖·瓦西里耶夫的帮助。我非常感激。