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

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

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

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

PHP

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

Python

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

Q&A

解決済

3回答

3043閲覧

PHPでexec()ができない

yor13

総合スコア8

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

PHP

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

Python

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

0グッド

0クリップ

投稿2019/12/22 06:09

編集2019/12/22 06:12

PHPからPythonを実行したいのでexec()を使おうと思ったのですが、なかなか上手くいきません。
PHPでexec()をできるようにしたいです。
また、もしも他の方法でPHPからPythonを実行する方法が分かる方は、それでもいいです。
回答待ってます。

実行方法http://localhost/test1.php

PHP

1##ファイル名 : test1.php 2<?php 3$cmd = "python \"C:\xampp\htdocs\test2.py\""; 4exec($cmd,$output,$a); 5print($a); 6print($output[0]); 7print($output[1]); 8print($output[2]); 9?> 10 11実行結果 121 13Notice: Undefined offset: 0 in C:\xampp\htdocs\test1.php on line 5 14 15Notice: Undefined offset: 1 in C:\xampp\htdocs\test1.php on line 6 16 17Notice: Undefined offset: 2 in C:\xampp\htdocs\test1.php on line 7

Python

1##ファイル名 : test2.py 2#!C:Python.exeのパス 3# -*- coding: utf-8 -*- 4 5print("Content-type:text/html\n\n") 6 7print("a") 8print("b") 9print("c") 10 11#http://localhost/test2.pyで実行すると、問題なく a b c が表示されています

環境
・Xammp
・Windows10

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

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

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

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

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

guest

回答3

0

ベストアンサー

python にパスが通っていないとか…?
python.exe のある場所を完全に指定してみてください。


追記

python

1# -*- coding: utf-8 -*- 2 3print("a") 4print("b") 5print("c")

php

1<?php 2 3$cmd = implode(' ', array_map('escapeshellarg', [ 4 'C:\python\python.exe', 5 'C:\xampp\test2.py', // ← htdocs の中に入れずに直接アクセスを防ぐほうがおすすめです 6])); 7 8exec($cmd, $output, $status); 9$output = implode("\n", $output) . "\n"; 10 11// htmlspecialchars や nl2br での変換を省略するために text/html ではなく text/plain を使う 12header('Content-Type: text/plain; charset=UTF-8'); 13 14if ($status === 0) { 15 echo $output; 16} else { 17 http_response_code(500); 18 echo "Command failed with status $status: $output"; 19}

投稿2019/12/22 06:15

編集2019/12/22 06:57
mpyw

総合スコア5223

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

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

mpyw

2019/12/22 06:21

#!C:Python.exeのパス で使っているのと全く同じパスを $cmd に書いてね,という意味ですね。例えば $cmd = "python \"C:\xampp\htdocs\test2.py\""; ↓ $cmd = "C:\python\python.exe \"C:\xampp\htdocs\test2.py\""; とか
mpyw

2019/12/22 06:25

Windows はちょっと疎いので不正確ですが, macOS や Linux においてはこの手の失敗は非常によくあります。$PATH を設定しているけど,それが設定されたユーザとApacheユーザが別になってて環境変数が効いてなくて,フルパスで指定する必要があるという流れですね
yor13

2019/12/22 06:43

やってみたら、エラーがなくなり実行できました。 実行結果 : 0Content-type:text/html ですが a b c が表示されません
mpyw

2019/12/22 06:47

print("Content-type:text/html\n\n") はPHPから利用する場合には不要です。PHPはHTTPヘッダはprintやechoとは別枠で,headerという関数を使って設定します。表示されていないのは [0] Content-type:text/html\n [1] \n [2] \n [3] a\n [4] b\n [5] c\n となっているからです。
yor13

2019/12/22 06:57

print("Content-type:text/html\n\n")を消したら、実行できました。 実行結果 : 0abc
mpyw

2019/12/22 06:58

回答をより安全な形に編集してみました
guest

0

さしあたり、以下はエスケープがおかしいです。

PHP

1$cmd = "python \"C:\xampp\htdocs\test2.py\"";

以下でどうでしょうか?

PHP

1$cmd = "python \"C:\xampp\htdocs\test2.py\"";

投稿2019/12/22 06:26

ockeghem

総合スコア11701

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

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

mpyw

2019/12/22 06:27

あ,これだw よくお気づきで… \t だとタブになりそうですね
yor13

2019/12/22 06:41

やってみたんですが、test1.phpと同じエラーが出ました。
guest

0

exec()関数は結構強引なやり方ではあるので、
Pythonの方をAPI化するのが良いのかなと思います。

Bottleなどの軽量フレームワークを使えば、手軽にPythonスクリプトのロジックをAPI化できます。

PHP内でPythonを使いたいということは、
おそらくですが機械学習やスクレイピング、分析などをやりたいからだと思うので、
API化しておいたほうが何かと便利です。
一度しておくだけで今後も利用できるので。

投稿2019/12/22 06:26

kota_yamashita

総合スコア356

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問