注:本次問題產生的環境是建議在windows環境下,利用IIS+PHP去呼叫Python指令碼失敗的前提下。如果你的環境與本次問題的環境不符。請自動規避。
在產品需求分析到一定階段,各個部門之間需要一定的協調。然後我們做全棧開發的就需要把這些都籠統協調起來。也就出現了後臺同時去調起不同模組、不同開發語言的需求。
首先後臺使用的是IIS+PHP的環境,且執行在windows上。通過PHP去呼叫Python的程式。
先說問題:在Python、PHP都加入系統的環境變數(且在cmd的模式下能正常執行)的前提下,通過執行a.php去調起1.py
PHP程式碼(a.php)
$result = exec("py 1.py"); var_dump($result);
Python程式碼(1.py)
print("123"); fl=open('test3.txt', 'w') fl.write("5,5,5,1,2,3") fl.close()
兩個目錄檔案在同一目錄下。且IIS可執行許可權給足(為了重現問題所在,就寫了最簡單的程式碼)然後就出現了執行報錯。
然後我將PHP程式碼改進,檢視exec函數執行的錯誤狀態碼
$result = exec("py 1.py", $array, $ret); var_dump($result); var_dump($array); var_dump($ret);
發現錯誤碼為103(執行錯誤)
【推薦學習:《》】
這一次我就將exec函數中的bash改成了標準輸出(為了確定具體錯誤資訊)
PS:在bash中0,1,2三個數位分代表STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,即標準輸入(一般是鍵盤),標準輸出(一般是顯示屏,準確的說是使用者終端控制檯),標準錯誤(出錯資訊輸出)。
$result = exec("py 1.py 2>error.txt", $array, $ret); var_dump($result); var_dump($array); var_dump($ret);
這一次執行以後,開啟error.txt居然出現了:Can't find a default Python.這種錯誤(前提我是將python加入了環境變數且cmd狀態下能直接執行py檔案),感覺就遇到了不能言語的錯誤。在充分排查環境變數、可執行許可權等錯誤以後。我下意識的將exec裡面的執行語句改成了
"python 1.py 2>error.txt"
這一次給我的錯誤居然是【'python' 不是內部或外部命令,也不是可執行的程式或批次檔。】我甚至一度懷疑這臺電腦有了他自己的想法。就在翻遍所有資料後。我突然想起可能是由於PHP是執行在IIS的伺服器上,然而IIS並不是一個所有使用者許可權(這一點即是IIS建站目錄許可權控制的優點,又是IIS建站的缺點)。結合之前error.txt檔案報的錯誤。我就將程式碼做一下修改。
$res = exec("你python的安裝絕對路徑/python.exe 1.py 2>error.txt", $array, $ret); var_dump($result); var_dump($array); var_dump($ret);
然後將python這個檔案下所有檔案的使用者擁有者增加一個IIS使用者控制可執行許可權。
這次PHP能找到了Python的可執行exe,成功將我們的程式碼執行了。
PS:IIS+Windows 不虧是一個黑洞。
更多程式設計相關知識,請存取:!!
以上就是淺談PHP執行Python指令碼的方法的詳細內容,更多請關注TW511.COM其它相關文章!