2011-10-06 2 views
6

ファイルを解析し、引数としてパスをとり、指定されたパスとすべてのサブディレクトリのすべてのファイルを-を使用して解析する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サーバーとパーサーは、ローカルマシン上でホストされています。

+0

あなたのpythonからのエラーメッセージを追加してもらえますか?そして、受け取ったパスを出力するためにpythonを入手しますか?私が知ることから、エコーデバッグは一流です。あなたのコマンドは正しいです。さて、あなたはPHPをどのように実行するかによって、実際にはパスは本当に無効です。クライアントまたはサーバー上のドライブは "I:"ですか?これはサーバー上で動作するためです。 –

+0

'$ command'は文字列リテラル(引用符ではなくアポストロフィを使って定義されています)であるため、バックスラッシュで問題ないでしょうか? Pythonパイプに渡す前に 'realpath()'でPHPのパスを検証しようとしていますか?おそらく 'pclose($ parser)'の最後にパイプを閉じてしまうかもしれません... – CD001

+0

Pythonプログラムのパスを印刷して、実際に何が得られているのか調べてみましょう。 –

答えて

1

PHPサーバーが実行されているユーザーを確認してください。 I:\がネットワークドライブの場合は、そのユーザーの下にマップされているとは思わないでください。代わりにUNCパスを使用します。しようとする

もの:

  • 異なるパス(私たちはC:\Workspaces\parsers\src\main\作品を知っている、なぜあなたはそれを試してみませんか?)
+0

あなた、私の友人は天才です! 'C:\ bla \ bla'でチェックしてみてください。 UNCの 'I:\'のパスをチェックして結果を返します... – K4KYA

+0

私は 'I:\'への良いUNCパスを試しましたが、私はまだ同じエラーが出ます。今私はこれがフォルダ特権と関係しているかもしれないと思っています。どのようなユーザとして実行されているかをPHPに出力する方法はありますか? – K4KYA

+0

まだ解決されていません。しかし、私はこれが正解であると合理的に確信しているので、私はそのようにマークしています。ありがとう! – K4KYA

関連する問題