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

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

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

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

PHP

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

Python

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

Q&A

解決済

1回答

3017閲覧

PHPでPythonを実行するとエラーとなる

mikeko0901

総合スコア227

Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

PHP

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

Python

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

0グッド

1クリップ

投稿2021/09/06 02:46

AWSの開発環境 cloud9を使用しています。
PHPからPythonを実行したいのですが、
Pythonだけを実行すると成功するのですが、PHPから実行するとPythonのコードでエラーがあります と出てしまいます。

■PHP側 sample.php

<?php /************************** pythonを呼び出して結果を受け取る ***************************/ $command="python test.py"; exec($command,$output); var_dump($output[0]);

■Python側 test.py (API連携を実装)

import base64 import datetime, base64, requests, json import pprint from Crypto.Hash import CMAC from Crypto.Cipher import AES sk = '****' sk_bytes = base64.b64decode(sk) secret_key_hex = sk_bytes[1:17].hex() print(secret_key_hex) sesame_id = '****' api_key = '****' cmd = 88 #Open history = 'test5' base64_history = base64.b64encode(bytes(history, 'utf-8')).decode() print(base64_history) headers = {'x-api-key': api_key} cmac = CMAC.new(bytes.fromhex(secret_key_hex), ciphermod=AES) ts = int(datetime.datetime.now().timestamp()) message = ts.to_bytes(4, byteorder='little') message = message.hex()[2:8] cmac = CMAC.new(bytes.fromhex(secret_key_hex), ciphermod=AES) cmac.update(bytes.fromhex(message)) sign = cmac.hexdigest() url = f'https://app.candyhouse.co/api/sesame2/{sesame_id}/cmd' body = { 'cmd': cmd, 'history': base64_history, 'sign': sign } res = requests.post(url, json.dumps(body), headers=headers) status_code = res.status_code print(res.status_code, res.text)

※Pythonファイルだけを実行した時。

$ python test.py

結果:きちんとprintされている値がプリントされています。

コードが出力 dGVzdDU= 404 <Response [200]>

※PHPファイルを実行

$ php sample.php

結果:Pythonファイルの方でエラーが返ってきます。

File "test.py", line 34 url = f'https://app.candyhouse.co/api/sesame2/{sesame_id}/cmd' ^ SyntaxError: invalid syntax

このURLの記載方法を

url = 'https://app.candyhouse.co/api/sesame2/' + sesame_id + '/cmd'

にするとこのエラーは消えますが別に

Traceback (most recent call last): File "test.py", line 2, in <module> import datetime, base64, requests, json File "/usr/lib/python2.7/site-packages/requests/__init__.py", line 58, in <module> from . import utils File "/usr/lib/python2.7/site-packages/requests/utils.py", line 32, in <module> from .exceptions import InvalidURL File "/usr/lib/python2.7/site-packages/requests/exceptions.py", line 10, in <module> from .packages.urllib3.exceptions import HTTPError as BaseHTTPError File "/usr/lib/python2.7/site-packages/requests/packages/__init__.py", line 95, in load_module raise ImportError("No module named '%s'" % (name,)) ImportError: No module named 'requests.packages.urllib3'

のようなモジュールの読込エラーが出てしまいます。

PHPからの呼び出し方法が悪いのだと思いますが、
アドバイスいただけますと幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

直接の回答ではありませんが、とっかかりだけ。
エラーメッセージ/usr/lib/python2.7/site-packages/requests/より
Pythonバージョンが直接呼出し(3.x)とPHPから呼出(2.7)で異なるようです。
環境要因なので具体的なアドバイスはできませんが
PHPからでも直接呼出と同じバージョンのPythonが呼び出されるようにする必要があります。

投稿2021/09/06 02:57

can110

総合スコア38266

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

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

mikeko0901

2021/09/06 03:05

ありがとうございます! $command="/usr/bin/python3.7 test.py"; のように、バージョンを指定したらできました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問