0

ボタンが1つあるhtmlファイルがあります。ボタンがクリックされると、javascript関数「run」が呼び出されます。

function run() {
            window.open("http://localhost/cgi-bin/run.py", "_self");
        }

run.pyは、端末に文字列「helloworld」を出力するhelloworld.exeプログラムを実行しようとしているだけですが、何も起こらず、ブラウザは「localhostを待機」し続けます。

#!python
import sys, string, os, cgitb

cgitb.enable()
os.system("helloworld.exe")

helloworld.exeを単独で試しましたが、動作します。ターミナルでrun.pyを実行しました。動作しました。また、ブラウザでテストサイトをテストしましたが、正常に動作しましたhttp://localhost/cgi-bin/helloworld.py(helloworld.pyは別のスクリプトです。私のapacheが正常に構成されているかどうかを確認してください)。

私はwampを使用しています。

私がやろうとしているのは、クライアントがサーバーに接続し、サーバー側のプログラムと「対話」できるようにする、より大きなプログラムです。プログラムはすでにC++で実行されており、phpやjavascriptに変換されません。

編集:私は関数subprocess.Popen、subprocess.call、os.systemを試してきました。また、apache / cgi-binフォルダーにある自分で作成した.exeファイル、またはc:\windowsにあるワードパッドなどの実行可能ファイルを実行するコードもテストしました。また、Pythonスクリプトがターミナルから実行される場合は常に成功し、ブラウザーから試行する場合は機能しません。使用しているサーバーが原因である可能性はありますか?wampのapacheを使用し、「AddHandlercgi-script.exe」という文をhttpd.confファイルに追加しました。

4

2 に答える 2

2

ローカルでは機能しないと確信しています。os.systemは、出力ではなく、コマンドの終了コードを返します。

subprocess.Popenを使用し、出力をパイプライン処理して出力を読み取る必要があります。

import subprocess
p = subprocess.Popen("whatever.exe",stdout=subprocess.PIPE)
print p.stdout.read()
p.wait()

また、CGIスクリプトの出力は有効なHTTPプロトコルではなく、問題を引き起こしている可能性のあるサーバーによっては(一部のサーバーはスクリプトの出力をサニタイズし、他のサーバーはスクリプトが正しく記述されていることを期待します)。

私にとって、このコード例は機能します(weborfをサーバーとして使用するGNU / Linuxで、ただし同じである必要があります)。コンテンツタイプを設定して、\ r \ n \ r\n最終シーケンスを送信してみてください。CGIスクリプトがさらにHTTPヘッダーを追加する可能性があるため、サーバーはそれを送信することを期待されていません。

#!/usr/bin/env python

import cgitb
import subprocess
import sys

cgitb.enable()

sys.stdout.write("Content-type: text/plain\r\n\r\n")

p = subprocess.Popen("/usr/games/fortune",stdout=subprocess.PIPE)
data = p.stdout.read()
p.wait()

print data
于 2013-03-12T08:50:26.120 に答える
0

一般に、私の経験では、ローカルで何かが機能し、別のサーバーに同じコードをすべてインストールしても機能しない場合は、アクセス許可の問題が発生しています。サイトの訪問者が持っているアクセス許可を確認し、Webサーバーを介してアクセスするユーザーが実行するための適切なアクセス許可を持っていることを確認してhelloworld.exeくださいrun.py

于 2013-03-06T11:25:42.567 に答える