ファイルを解析し、引数としてパスをとり、指定されたパスとすべてのサブディレクトリのすべてのファイルを-を使用して解析するPythonプログラムがあります。私はこれを私のPHP Web Appから呼び出したいので、ユーザーはパスを指定することができます。パスは、引数としてパーザに渡されます。 (パスを通過するのは内部ネットワーク上のすべてであるため、問題ありません)。PHPからPythonに有効なパスを渡す
私はパーサーを細かく呼び出して、popen()
を使って引数を渡すことができますが、Pythonプログラムが受け取るパスは常に無効です。私はPHPスクリプト出力をブラウザに送信しています。そのコマンドをコピーしてコマンドウィンドウに貼り付けると、パーサーが正常に動作します。 Pythonスクリプトでos.path.exists(path)
の結果から、私はPHPスクリプトが通るパスが無効である知っている
これは、Pythonプログラムを呼び出すためのコードです:
$path = $_REQUEST['location'];
echo "Path given is: ".$path;
$command = 'python C:\Workspaces\parsers\src\main\main.py '. intval($mode).' "'.$path.'"';
echo "<p>".$command."</p>";
$parser = popen($command, 'r');
if ($parser){
echo "<p>Ran the program</p>";
while (!feof($parser)){
$read = fgets($parser);
if (!$read)
echo "<p>Reached end of file</p>";
else
echo "<p>".$read."</p>";
}
}
ブラウザにエコーコマンド
2は、ちょうど別のスクリプトへの引数とですpython C:\Workspaces\parsers\src\main\main.py 2 "I:\Dir1\Dir2\Dir3"
:ようなものですは、呼び出しページのフォームの入力テキストボックスから定義されます。
これはWindowsシステム上にあるため、これはパス内のバックスラッシュと関係があると想定しています。
基本的に、すべてのバックスラッシュの処理方法はわかりません。バックスラッシュを含む文字列がPHPページにどのように送信され、どのようにそれらがpopen()
を使って再び送られるかを理解したいと思います。私はブラウザに印刷された結果が生のコマンド文字列ではないと思うので、実際にpopen()が発行しているコマンドにバックスラッシュがいくつあるのかわかりません。
誰かが私が本当に感謝しているアイデアがあれば。
編集:次のように
だから、Pythonプログラムにパスが使用されます。
nfiles=0
print 'Parsing all files in directory tree '+path+"<br />"
start = time.time()
if not os.path.exists(path):
print "<p>Path is NOT REAL!!!</p>"
else:
print "<p>Path IS real!</p>"
for root, dirs, files in os.walk(path):
for f in files:
file = os.path.join(root,f)
print file
nfiles+=1
...Code to run parser...
print nfiles, "Files parsed<br />"
これは$リード変数からブラウザにエコーされます。その
出力は:
Parsing all files in directory tree I:\Dir1\Dir2\Dir3
Path is NOT REAL!!!
0 Files parsed
コマンドは(コマンドCMDウィンドウにブラウザからコピー&ペーストされる)コマンドラインから実行される場合、この出力と同一です。ただし、その方法を実行すると、パスは実際になり、すべてのファイルが解析されます。 (そしてコマンドウィンドウにもhtmlマークアップが表示されます)
Webサーバーとパーサーは、ローカルマシン上でホストされています。
あなたのpythonからのエラーメッセージを追加してもらえますか?そして、受け取ったパスを出力するためにpythonを入手しますか?私が知ることから、エコーデバッグは一流です。あなたのコマンドは正しいです。さて、あなたはPHPをどのように実行するかによって、実際にはパスは本当に無効です。クライアントまたはサーバー上のドライブは "I:"ですか?これはサーバー上で動作するためです。 –
'$ command'は文字列リテラル(引用符ではなくアポストロフィを使って定義されています)であるため、バックスラッシュで問題ないでしょうか? Pythonパイプに渡す前に 'realpath()'でPHPのパスを検証しようとしていますか?おそらく 'pclose($ parser)'の最後にパイプを閉じてしまうかもしれません... – CD001
Pythonプログラムのパスを印刷して、実際に何が得られているのか調べてみましょう。 –