phpからpythonを実行したいのですが、python単独では実行できるのものの、phpからの実行がうまくできない状況です。
requestsのimportに問題があるのでは、と思っているのですが、ご存知の方がいれば教えていただけると幸いです。
【取り組んだこと・試したこと】
- phpとは別でpyファイルを用意し、exec関数でpyファイルを読み込み
- pythonの中では、requestsを使って、slack apiのレスポンスを受け取っている
- pyファイル単独では実行を確認できている
- phpから実行すると、apiのレスポンスが受け取れない(素の?pythonの出力は受け取れている)
- import requestsの実行順序を初めに持ってくると、pythonの出力が全て受け取れなくなってしまうので、import requestsに何か問題があるか、と思って調べると、https://qiita.com/Pentas/items/00ef6d1e280e8c38a7b4 を見つけ、putenvを使って、環境変数を教えれば良いものと理解
- sudoコマンドでrequestsのlocationを見つけ、そのまま貼り付けているのですが、500errorとなってしまいます。(パスの記載の仕方が違うのでしょうか??)
test2.php(php部分)
php
1<?php 2putenv('/Users/tianbianhongzhi/.pyenv/versions/3.8.2/lib/python3.8/site-packages'); 3$command="python exec_from_php.py "; 4exec($command,$output); 5print "$output[0]\n"; 6print "$output[1]\n"; 7print "$output[2]\n"; 8print "$output[3]\n"; 9// print "$output"; 10// var_dump($output); 11// ここから処理を記述 12// じゃんけんの手を配列に代入 13$hands = ['グー', 'チョキ', 'パー']; 14// プレイヤーの手がPOSTされたら 15if (isset($_POST['playerHand'])) { 16 // プレイヤーの手を代入 17 $playerHand = $_POST['playerHand']; 18 // PCの手をランダムで選択 19 $key = array_rand($hands); 20 $pcHand = $hands[$key]; 21 // 勝敗を判定 22 if ($playerHand == $pcHand) { 23 $result ='あいこ'; 24 } elseif ($playerHand == 'グー' && $pcHand == 'チョキ') { 25 $result = '勝ち'; 26 } elseif ($playerHand == 'チョキ' && $pcHand == 'パー') { 27 $result = '勝ち'; 28 } elseif ($playerHand == 'パー' && $pcHand == 'グー') { 29 $result = '勝ち'; 30 } else { 31 $result = '負け'; 32 } 33} 34// ファイルに書き込み 35$time = date('Y-m-d H:i:s'); 36$file = fopen('./data/data.txt', 'a'); 37fwrite($file, $time .' '. $result . "\n"); 38// ファイルを読み込み 39$openfile = fopen('./data/data.txt', 'r'); 40// ファイル内容を1行ずつ読み込んで出力= fgets 41// whileは()の中身がfalseになると、処理を終了 42$history =[]; 43$num_victory = 0; 44$num_lost = 0; 45$num_tie = 0; 46while($line = fgets($openfile)) { 47 array_push($history, $line); 48 if(strpos($line,'勝ち') !== false){ 49 //'abcd'のなかに'bc'が含まれている場合 50 $num_victory = $num_victory + 1; 51 }else if(strpos($line,'負け') !== false){ 52 $num_lost = $num_lost + 1; 53 }else { 54 $num_tie = $num_tie + 1; 55 } 56} 57// 勝ち、負け、あいこの数を数える 58// var_dump($num_victory); 59// echo "おはよう"; 60fclose($file); 61?>
exec_from_php.py
python
1import requests 2import json 3print("1line") 4print("2line") 5print("3line") 6def main(): 7 for num in range(5): 8 print(num) 9 url = "https://slack.com/api/conversations.history" 10 token = "xxx" 11 channel_id = "yyy" 12 payload = { 13 "token": token, 14 "channel": channel_id 15 } 16 response = requests.get(url, params=payload) 17 json_data = response.json() 18 messages = json_data["messages"] 19 for i in messages[:20]: 20 print(i["text"]) 21main() 22print("4line")
ターミナル
(base) tanabehiroyukinoMacBook-Pro:test tianbianhongzhi$ sudo pip show requests Password: WARNING: The directory '/Users/tianbianhongzhi/Library/Caches/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag. Name: requests Version: 2.23.0 Summary: Python HTTP for Humans. Home-page: https://requests.readthedocs.io Author: Kenneth Reitz Author-email: me@kennethreitz.org License: Apache 2.0 Location: /Users/tianbianhongzhi/.pyenv/versions/3.8.2/lib/python3.8/site-packages Requires: chardet, idna, certifi, urllib3 Required-by: googlemaps, google-api-core, geocoder (base) tanabehiroyukinoMacBook-Pro:test tianbianhongzhi$ sudo pip show json WARNING: The directory '/Users/tianbianhongzhi/Library/Caches/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag. WARNING: Package(s) not found: json (base) tanabehiroyukinoMacBook-Pro:test tianbianhongzhi$
■その後試したこと
以下を実行
php
1<?php 2 3function env(){ 4 5 putenv( "$PATH= /Users/tianbianhongzhi/opt/anaconda3/bin/python"); 6 7 $command="python exec_from_php.py 2>&1"; 8 exec($command,$output); 9 var_dump($output); 10 11} 12env();
出力
array(4) { [0]=> string(34) "Traceback (most recent call last):" [1]=> string(46) " File "exec_from_php.py", line 1, in " [2]=> string(19) " import requests" [3]=> string(37) "ImportError: No module named requests" }
requestsのlocation確認
(base) tanabehiroyukinoMacBook-Pro:test tianbianhongzhi$ pip show requests Name: requests Version: 2.23.0 Summary: Python HTTP for Humans. Home-page: https://requests.readthedocs.io Author: Kenneth Reitz Author-email: me@kennethreitz.org License: Apache 2.0 Location: /Users/tianbianhongzhi/.pyenv/versions/3.8.2/lib/python3.8/site-packages Requires: certifi, chardet, idna, urllib3 Required-by: googlemaps, google-api-core, geocoder
検索しているパスの確認
sys.path ['/Applications/MAMP/htdocs/php01haifu', '/Users/tianbianhongzhi/.pyenv/versions/3.8.2/lib/python38.zip', '/Users/tianbianhongzhi/.pyenv/versions/3.8.2/lib/python3.8', '/Users/tianbianhongzhi/.pyenv/versions/3.8.2/lib/python3.8/lib-dynload', '', '/Users/tianbianhongzhi/.pyenv/versions/3.8.2/lib/python3.8/site-packages', '/Users/tianbianhongzhi/.pyenv/versions/3.8.2/lib/python3.8/site-packages/IPython/extensions', '/Users/tianbianhongzhi/.ipython']
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/24 23:36