簡體   English   中英

調用python腳本*從php導入*非標准庫

[英]call python script *with non-standard library imported* from php

我已經搜索了所有相關問題,有很多類似的問題,但我的問題是

如何從 php 調用一個 python 腳本,我在其中導入了一些非標准庫/模塊

更具體地說,我有一個 .py 文件 test.py,我在其中導入了 pycurl 和 Bottlenose,這是一個 amazon API 包裝器。 這兩個模塊都不在標准庫中。 所以文件看起來像

import pycurl
import bottlenose
...
print "hello!"

然后我做了一個php文件,test.php

<?
$output = array();
exec("/home/my_user_name/local/Python-2.7/bin/python test.py", $output, $ret_code);
var_dump( $output);
echo $ret_code;
?>

test.php 和 test.py 都在同一個目錄下。 更重要的是如果我跑

php test.php 

在我的終端中,它沒有問題。 成功輸出“hello”,返回碼為0,表示程序無錯誤退出

但是,當我在瀏覽器www.someurl.com/test.php 上對其進行測試時,出現了一些錯誤。 我一行一行地跟蹤,發現錯誤發生在“import pycurl”和“import bottlenose”。

我還嘗試打印出 sys.path,它確實包含了寬吻的路徑。

有人可以幫忙嗎?

謝謝!!

如果您在調用 Python 程序之前在 php 腳本中調用 putenv,我會相信 sys.path 是正確的。

從成功運行開始,借此機會打印 sys.path。 讓我們將此打印的結果稱為“x”。 然后,嘗試以下操作:

putenv('PYTHONPATH=x');
exec("/home/my_user_name/local/Python-2.7/bin/python test.py", $output, $ret_code);

這有幫助嗎?

通常,您不會以my_user_name身份運行 Web 服務器,而是以httpdwwwnobody等特殊用戶的身份運行。 並且該用戶可能無權讀取您安裝的 Python 模塊,這當然會使導入失敗。

要對此進行測試,請嘗試在導入之前打開它:

try:
    with open('/path/to/bottlenose.py', 'r') as f:
        print('Opened file just fine')
except Exception as e:
    print('Failed to open file: %s' % (e,))

當然,如果print在您的設置中不起作用,無論您為打印出sys.path做了什么,都在這里做同樣的事情。

如果這不是問題,您可以嘗試將導入包裝在try塊中以打印出異常並查看它失敗的原因,這樣我們就不必猜測了。

如果這問題,快速而骯臟的解決方案是讓您的 Web 服務器帳戶通過chmod訪問您用戶的 Python 模塊目錄……但更好的解決方案是將模塊安裝到系統范圍的站點包目錄或擁有的目錄通過 Web 服務器帳戶。

對於您的情況來說,它可能太重了,但是您是否考慮過virtualenv

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM