PHPのfopenとpopenについて教えてください。


popenが使用できなレンタルサーバーでfopenを使用するように案内されました。
popenでpythonのスクリプトを実行して、実行結果を受け取っていました。fopenを使用するとpythonのソースコードがロードされるだけで実行してくれません。popenのようにfopenでpythonスクリプトを実行することはできるのでしょうか。

回答の条件
  • URL必須
  • 1人10回まで
  • 登録:2009/05/30 14:46:05
  • 終了:2009/06/05 22:26:51

ベストアンサー

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/05/30 14:59:05

ポイント20pt

そのWebサーバは、Phyhon スクリプトを実行可能ですよね。

たとえば、http://hoge.com/hogehoge.py というスクリプトがあり、実行結果を標準出力に出しているのであれば、fopen('http://hoge.com/hogehoge.py', 'r') と fgets の組み合わせで出力結果を取得できるはずです。

id:shibaki

はい、Webサーバーはpythonに対応していて、hello wroldを表示する外部公開用のスクリプトはうまく動いています。元々popenで呼び出していたpythonスクリプトはコマンドラインで動くもので、popenではスクリプトのサーバー内の絶対パスを指定していました。外部公開用に作り直す方法しかありませんか?

>>追記です。

「標準出力」を見落としていました。トライしてみます。

2009/05/30 16:02:38

その他の回答(4件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/05/30 14:59:05ここでベストアンサー

ポイント20pt

そのWebサーバは、Phyhon スクリプトを実行可能ですよね。

たとえば、http://hoge.com/hogehoge.py というスクリプトがあり、実行結果を標準出力に出しているのであれば、fopen('http://hoge.com/hogehoge.py', 'r') と fgets の組み合わせで出力結果を取得できるはずです。

id:shibaki

はい、Webサーバーはpythonに対応していて、hello wroldを表示する外部公開用のスクリプトはうまく動いています。元々popenで呼び出していたpythonスクリプトはコマンドラインで動くもので、popenではスクリプトのサーバー内の絶対パスを指定していました。外部公開用に作り直す方法しかありませんか?

>>追記です。

「標準出力」を見落としていました。トライしてみます。

2009/05/30 16:02:38
id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332009/05/30 17:04:42

ポイント20pt

コメント欄に書き込めないので、回答欄で補足します。


たとえば、以下の Python スクリプトの出力結果をPHP側で受け取るには、

print "Content-type:text/html; charset=UTF-8\n\n";
print "<html>\n";
print "Hello Python World!"
print "\n</html>\n";

下記のように書くことで表示できます。

$infp = fopen('http://pythonスクリプト名', 'r');
while (($str = fgets($infp)) != FALSE) {
    echo $str;
}
fclose($infp);

ポイントは、fopen に渡すスクリプト名を "http://" ではじまるフルネームにすることです。


※設定された回答回数の上限になりました。さらにフォローが必要でしたら、コメント欄を開けていただくか、回答回数を増やしてください。

id:shibaki

アドバイスをありがとうございます。いまはコマンドライン専用のスクリプトのためかエラーになってしまいます。少し直さないとだめかもしれません。コマンドラインでオプションのパラメータ(-gなど)と引数(文字列)をつけているのですが、そういった受け渡しも可能でしょうか。Pythonをよく知らずにうかがっているのでご迷惑かもしれませんが、よろしくお願いします。

2009/05/30 18:28:31
id:pahoo No.3

pahoo回答回数5960ベストアンサー獲得回数6332009/05/30 18:48:00

ポイント20pt

いまはコマンドライン専用のスクリプトのためかエラーになってしまいます

これは CGI スクリプトにする必要があります。


CGI対応にすると、コマンドラインオプションの渡し方は変えなければなりません。

GET変数で渡すのが一般的です。具体的な手順は「httpリクエストのGETクエリをpythonで受ける」をご覧ください。

id:shibaki

もしよかったらお付き合いください。

現在のスクリプトはこんな感じでコマンドラインから引数を受け取っています。

parser = optparse.OptionParser(

usage='Usage: %prog [options] url...',

version='2009.04.25',

conflict_handler='resolve',

)

parser.add_option('-g', '--get-sim',action='store_true', dest='getsim', help='simulate, quiet but print SIM', default=False)

(opts, args) = parser.parse_args()

そこで

(opts, args) = parser.parse_args()

を#でコメントアウトしてopts[]と宣言し

query = cgi.parse_qs(os.environ['QUERY_STRING'])

args=query['vb'][0]

opts.getsim = False

としてみたのですが

optsにgetsimなんてattributeはないよってしかられます。

現在のコードにoptsが多用されているのでoptsを生かして変更しているのですが

optsをうまく差し替える方法などありますか。

2009/05/30 21:48:18
id:QuestR2 No.4

QuestR2回答回数435ベストアンサー獲得回数132009/05/31 00:32:19

id:shibaki

popenが使えないのですがproc-openを試してみます。

2009/06/05 22:26:07
id:b-wind No.5

b-wind回答回数3344ベストアンサー獲得回数4402009/06/01 09:40:56

ポイント20pt

外部プログラムの出力を受け取りたいだけなら、exec 関数の方がいいと思うのだけど。

PHP: exec - Manual

ファイルハンドルは受け取れませんが、通常の用途なら十分かと。

id:shibaki

popen以外にも関数があるのですね。ありがとうございます。やってみます。

2009/06/05 22:25:22

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません