質問編集履歴

3 試したことの追記

dbrow

dbrow score 18

2020/12/24 22:03  投稿

【phpからpythonの実行】phpファイル内でrequestsの環境変数を記載する方法
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
<?php
putenv('/Users/tianbianhongzhi/.pyenv/versions/3.8.2/lib/python3.8/site-packages');
$command="python exec_from_php.py ";
exec($command,$output);
print "$output[0]\n";
print "$output[1]\n";
print "$output[2]\n";
print "$output[3]\n";
// print "$output";
// var_dump($output);
// ここから処理を記述
// じゃんけんの手を配列に代入
$hands = ['グー', 'チョキ', 'パー'];
// プレイヤーの手がPOSTされたら
if (isset($_POST['playerHand'])) {
   // プレイヤーの手を代入
   $playerHand = $_POST['playerHand'];
   // PCの手をランダムで選択
   $key = array_rand($hands);
   $pcHand = $hands[$key];
   // 勝敗を判定
   if ($playerHand == $pcHand) {
       $result ='あいこ';
   } elseif ($playerHand == 'グー' && $pcHand == 'チョキ') {
       $result = '勝ち';
   } elseif ($playerHand == 'チョキ' && $pcHand == 'パー') {
       $result = '勝ち';
   } elseif ($playerHand == 'パー' && $pcHand == 'グー') {
       $result = '勝ち';
   } else {
       $result = '負け';
   }
}
// ファイルに書き込み
$time = date('Y-m-d H:i:s');
$file = fopen('./data/data.txt', 'a');
fwrite($file, $time .' '. $result . "\n");
// ファイルを読み込み
$openfile = fopen('./data/data.txt', 'r');
// ファイル内容を1行ずつ読み込んで出力= fgets
// whileは()の中身がfalseになると、処理を終了
$history =[];
$num_victory = 0;
$num_lost = 0;
$num_tie = 0;
while($line = fgets($openfile)) {
   array_push($history, $line);
   if(strpos($line,'勝ち') !== false){
       //'abcd'のなかに'bc'が含まれている場合
       $num_victory = $num_victory + 1;
     }else if(strpos($line,'負け') !== false){
       $num_lost = $num_lost + 1;
     }else {
       $num_tie = $num_tie + 1;
     }
}
// 勝ち、負け、あいこの数を数える
// var_dump($num_victory);
// echo "おはよう";
fclose($file);
?>
```
exec_from_php.py
```python
import requests
import json
print("1line")
print("2line")
print("3line")
def main():
   for num in range(5):
       print(num)
   url = "https://slack.com/api/conversations.history"
   token = "xxx"
   channel_id = "yyy"
   payload = {
       "token": token,
       "channel": channel_id
   }
   response = requests.get(url, params=payload)
   json_data = response.json()
   messages = json_data["messages"]
   for i in messages[:20]:
       print(i["text"])
main()
print("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
<?php
function env(){
   putenv( "$PATH= /Users/tianbianhongzhi/opt/anaconda3/bin/python");
   $command="python exec_from_php.py 2>&1";
   exec($command,$output);
   var_dump($output);
}
env();
```
出力
```ここに言語を入力
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']
```
  • PHP

    38447 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Python

    36907 questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • API

    3692 questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • import

    649 questions

    自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

  • Slack

    449 questions

    Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

2 体裁修正

dbrow

dbrow score 18

2020/12/24 12:08  投稿

【phpからpythonの実行】phpファイル内でrequestsの環境変数を記載する方法
phpからpythonを実行したいのですが、python単独では実行できるのものの、phpからの実行がうまくできない状況です。
requestsのimportに問題があるのでは、と思っているのですが、ご存知の方がいれば教えていただけると幸いです。
【取り組んだこと・試したこと】
- リストphpとは別でpyファイルを用意し、exec関数でpyファイルを読み込み
- 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
<?php
putenv('/Users/tianbianhongzhi/.pyenv/versions/3.8.2/lib/python3.8/site-packages');
$command="python exec_from_php.py ";
exec($command,$output);
print "$output[0]\n";
print "$output[1]\n";
print "$output[2]\n";
print "$output[3]\n";
// print "$output";
// var_dump($output);
// ここから処理を記述
// じゃんけんの手を配列に代入
$hands = ['グー', 'チョキ', 'パー'];
// プレイヤーの手がPOSTされたら
if (isset($_POST['playerHand'])) {
   // プレイヤーの手を代入
   $playerHand = $_POST['playerHand'];
   // PCの手をランダムで選択
   $key = array_rand($hands);
   $pcHand = $hands[$key];
   // 勝敗を判定
   if ($playerHand == $pcHand) {
       $result ='あいこ';
   } elseif ($playerHand == 'グー' && $pcHand == 'チョキ') {
       $result = '勝ち';
   } elseif ($playerHand == 'チョキ' && $pcHand == 'パー') {
       $result = '勝ち';
   } elseif ($playerHand == 'パー' && $pcHand == 'グー') {
       $result = '勝ち';
   } else {
       $result = '負け';
   }
}
// ファイルに書き込み
$time = date('Y-m-d H:i:s');
$file = fopen('./data/data.txt', 'a');
fwrite($file, $time .' '. $result . "\n");
// ファイルを読み込み
$openfile = fopen('./data/data.txt', 'r');
// ファイル内容を1行ずつ読み込んで出力= fgets
// whileは()の中身がfalseになると、処理を終了
$history =[];
$num_victory = 0;
$num_lost = 0;
$num_tie = 0;
while($line = fgets($openfile)) {
   array_push($history, $line);
   if(strpos($line,'勝ち') !== false){
       //'abcd'のなかに'bc'が含まれている場合
       $num_victory = $num_victory + 1;
     }else if(strpos($line,'負け') !== false){
       $num_lost = $num_lost + 1;
     }else {
       $num_tie = $num_tie + 1;
     }
}
// 勝ち、負け、あいこの数を数える
// var_dump($num_victory);
// echo "おはよう";
fclose($file);
?>
```
exec_from_php.py
```python
import requests
import json
print("1line")
print("2line")
print("3line")
def main():
   for num in range(5):
       print(num)
   url = "https://slack.com/api/conversations.history"
   token = "xxx"
   channel_id = "yyy"
   payload = {
       "token": token,
       "channel": channel_id
   }
   response = requests.get(url, params=payload)
   json_data = response.json()
   messages = json_data["messages"]
   for i in messages[:20]:
       print(i["text"])
main()
print("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

    38447 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Python

    36907 questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • API

    3692 questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • import

    649 questions

    自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

  • Slack

    449 questions

    Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

1 体裁修正

dbrow

dbrow score 18

2020/12/24 12:08  投稿

【phpからpythonの実行】phpファイル内でrequestsの環境変数を記載する方法
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となってしまいます。(パスの記載の仕方が違うのでしょうか??)
- リスト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
<?php
putenv('/Users/tianbianhongzhi/.pyenv/versions/3.8.2/lib/python3.8/site-packages');
$command="python exec_from_php.py ";
exec($command,$output);
print "$output[0]\n";
print "$output[1]\n";
print "$output[2]\n";
print "$output[3]\n";
// print "$output";
// var_dump($output);
// ここから処理を記述
// じゃんけんの手を配列に代入
$hands = ['グー', 'チョキ', 'パー'];
// プレイヤーの手がPOSTされたら
if (isset($_POST['playerHand'])) {
   // プレイヤーの手を代入
   $playerHand = $_POST['playerHand'];
   // PCの手をランダムで選択
   $key = array_rand($hands);
   $pcHand = $hands[$key];
   // 勝敗を判定
   if ($playerHand == $pcHand) {
       $result ='あいこ';
   } elseif ($playerHand == 'グー' && $pcHand == 'チョキ') {
       $result = '勝ち';
   } elseif ($playerHand == 'チョキ' && $pcHand == 'パー') {
       $result = '勝ち';
   } elseif ($playerHand == 'パー' && $pcHand == 'グー') {
       $result = '勝ち';
   } else {
       $result = '負け';
   }
}
// ファイルに書き込み
$time = date('Y-m-d H:i:s');
$file = fopen('./data/data.txt', 'a');
fwrite($file, $time .' '. $result . "\n");
// ファイルを読み込み
$openfile = fopen('./data/data.txt', 'r');
// ファイル内容を1行ずつ読み込んで出力= fgets
// whileは()の中身がfalseになると、処理を終了
$history =[];
$num_victory = 0;
$num_lost = 0;
$num_tie = 0;
while($line = fgets($openfile)) {
   array_push($history, $line);
   if(strpos($line,'勝ち') !== false){
       //'abcd'のなかに'bc'が含まれている場合
       $num_victory = $num_victory + 1;
     }else if(strpos($line,'負け') !== false){
       $num_lost = $num_lost + 1;
     }else {
       $num_tie = $num_tie + 1;
     }
}
// 勝ち、負け、あいこの数を数える
// var_dump($num_victory);
// echo "おはよう";
fclose($file);
?>
```
exec_from_php.py
```python
import requests
import json
print("1line")
print("2line")
print("3line")
def main():
   for num in range(5):
       print(num)
   url = "https://slack.com/api/conversations.history"
   token = "xxx"
   channel_id = "yyy"
   payload = {
       "token": token,
       "channel": channel_id
   }
   response = requests.get(url, params=payload)
   json_data = response.json()
   messages = json_data["messages"]
   for i in messages[:20]:
       print(i["text"])
main()
print("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

    38447 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Python

    36907 questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • API

    3692 questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • import

    649 questions

    自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

  • Slack

    449 questions

    Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る