人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

●質問者: shibaki
●カテゴリ:コンピュータ インターネット
✍キーワード:Python スクリプト ソースコード レンタルサーバー HP
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● pahoo
●20ポイント ベストアンサー

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

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

◎質問者からの返答

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

>>追記です。

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


2 ● pahoo
●20ポイント

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


たとえば、以下の 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://" ではじまるフルネームにすることです。


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

◎質問者からの返答

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


3 ● pahoo
●20ポイント

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

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


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

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

◎質問者からの返答

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

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

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をうまく差し替える方法などありますか。


4 ● QuestR2
●20ポイント

http://php.atpedia.jp/php/ja/function.proc-open.html

◎質問者からの返答

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


5 ● b-wind
●20ポイント

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

PHP: exec - Manual

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

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ