質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
import

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

PHP

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

Python

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

Slack

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

API

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

Q&A

解決済

2回答

2548閲覧

【phpからpythonの実行】phpファイル内でrequestsの環境変数を記載する方法

dbrow

総合スコア18

import

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

PHP

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

Python

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

Slack

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

API

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

0グッド

0クリップ

投稿2020/12/24 03:06

編集2020/12/24 13:03

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']

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

sys.path
['/Applications/MAMP/htdocs/php01haifu',
'/Users/tianbianhongzhi/.pyenv/versions/3.8.2/lib/python38.zip',

macOS で、pyenv をお使いのようですが、ログインユーザーではなく、PHP を実行している Web サーバーのユーザーで、pyenv を使えるように設定していますか?

pyenv の設定していない場合は、おそらくシステムのPython が使われると思います。

Webサーバーのユーザーで、pyenv を使えるように設定するか
システムのPython で、プログラムを実行できるように環境を変更してください。

投稿2020/12/24 22:53

CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

0

ベストアンサー

まずは状況を確認しましょう。2>&1でエラーメッセージを取得します。

PHP

1<?php 2putenv('/Users/tianbianhongzhi/.pyenv/versions/3.8.2/lib/python3.8/site-packages'); 3$command="python exec_from_php.py 2>&1"; 4exec($command,$output); 5var_dump($output);

を実行。

なお、

putenv('/Users/tianbianhongzhi/.pyenv/versions/3.8.2/lib/python3.8/site-packages');

は使い方を間違ってます。コマンドで環境変数の設定ってやったことないでしょうか?

投稿2020/12/24 03:21

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dbrow

2020/12/24 04:48

ご返答ありがとうございます。 上記実行しますと、 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" } という出力です。 コマンドでの環境変数の設定は、やったことはあります。 宜しくお願いします。
otn

2020/12/24 04:54

No module named requests ですね。 python環境が複数あって、稼働を確認した環境のpythonと、execで起動したpythonが違うのでしょう。 稼働を確認した環境のpythonをフルパスでexecすれば良いのではないでしょうか。
otn

2020/12/24 04:56

> コマンドでの環境変数の設定は、やったことはあります。 環境変数の設定は、「xxxxという名前の環境変数にyyyyという値を設定する」という風に行いましたよね? putenvもです。
dbrow

2020/12/24 13:07

(試したことを追記いたしました。) >稼働を確認した環境のpythonをフルパスでexecすれば良いのではないでしょうか。 こちらの通り、フルパスでexecしたところ、pythonは問題ない?ようなのですが、ImportError: No module named requests となっています。 Pythonが探索するパスのリストに、requestsのlocationは含まれているようなのですが、何か考えられる原因はありますでしょうか?
otn

2020/12/24 13:35 編集

稼働を確認した環境のpythonと、execで起動したpythonが違うのでしょう。 としか言えないですね。 記述したフルパスが間違っているのでしょう。 > pyファイル単独では実行を確認できている のときのpythonのフルパスを書いてください。 調べ方はわかりますか? > putenv( "$PATH= /Users/tianbianhongzhi/opt/anaconda3/bin/python"); 全然駄目なので、もうputenvの事は全部記憶から消しましょう。 どのみち今回は関係ないので、コードからも削除して置いて下さい。
dbrow

2020/12/24 13:35

import os print(os.getenv('PATH')) /Users/tianbianhongzhi/.pyenv/versions/3.8.2/bin:/usr/local/Cellar/pyenv/1.2.18/libexec:/Users/tianbianhongzhi/.pyenv/shims:/Users/tianbianhongzhi/.pyenv/bin:/Users/tianbianhongzhi/opt/anaconda3/bin:/Users/tianbianhongzhi/opt/anaconda3/condabin:/anaconda3/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin 承知しました。 やり方は上記の通りかと思うのですが、合っていますでしょうか。
otn

2020/12/24 13:38

違います。 シェルのプロンプトで、 python exec_from_php.py と実行して、期待通りの動作をすることを確認した上で、 which python です。
dbrow

2020/12/24 21:43

期待通りの動作を確認の上、下記の通り実行しました。 /Users/tianbianhongzhi/.pyenv/shims/python (base) tanabehiroyukinoMacBook-Pro:test tianbianhongzhi$ which python /Users/tianbianhongzhi/.pyenv/shims/python
otn

2020/12/25 00:23 編集

> 稼働を確認した環境のpythonをフルパスでexecすれば良いのではないでしょうか。 に対して、 $command="/Users/tianbianhongzhi/.pyenv/shims/python exec_from_php.py 2>&1"; と書きましたか? Webサーバーで実行するなら、そのユーザーで /Users/tianbianhongzhi/.pyenv 以下が読めるようになっていないといけないですが。
dbrow

2020/12/27 04:57

おっしゃっていただいた点、抜けておりました。 $command="/Users/tianbianhongzhi/.pyenv/shims/python exec_from_php.py 2>&1"; exec($command,$output); とフルパスでexecすることで、出力確認できました。 ご教示頂きまして誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問