2012-04-19 9 views
2

私はjsmin.cをダウンロードしてコンパイルし、それをターミナルからのjavascriptファイルで実行しました。これはうまくいくようです。しかし、os.system()やos.popen()をpythonスクリプト(同じ入力ファイル)で呼び出すと、出力ファイル(jsファイルの縮小版)が切り捨てられます。サブプロセスが終了する前にフラッシュされないか、jsminが早期に終了したかのように、ディスクバッファリングなどで何かが起きているかのように見えます。なぜ、jsminはPythonのサブプロセスで実行すると早く終了するのですか?

しかし、これらの事柄のどれもそうではないようです。 exit値は、出力が切り捨てられてもmain()から返されたもので、fflush(stdout)への呼び出しを追加しても何の違いもなく、jsminを呼び出した後に同じサブシェル内からsyncを呼び出すと、任意の違い。

私はputput()への呼び出しをfputc()への呼び出しで置き換えようとしましたが、最初は問題を解決したように見えましたが、それは不可解なことではありません。確実に起こる。 Bizare?

私はjsmin.cでいくつかの問題があると言いますが、プログラムはコマンドラインから実行すると同じ入力ファイルで正常に動作するので、Pythonのサブプロセスから実行することと関係があります。

ここに私のサブプロセスの呼び出しです:

result = os.system('jsmin < ' + tpathname + ' > ' + tpathname + '.min') 

(。私はパスでjsminを入れている、それが実行されている、私は.minファイルに予想される結果のほとんどを得る)

でき、誰もがこの問題の原因は何か想像してみてください。

+0

あなたはシェルから直接から実行したときに 'jsmin jsfile.min'コマンドが正常に動作することを言っていますか? 'os.system()'がシェルをフォークするので、_jsmin_の実行環境はどちらの場合もほぼ同じになるはずです。 – C2H5OH

+0

はい、それは私が言っていることです。私はshebangで始まるjsminを実行するシェルスクリプトを作成しようとしました。そのシェルスクリプトは端末からは動作しますが、Pythonからは起動しません。 WTF? – Shavais

+0

私はenvをシェ​​ルスクリプトからファイルに書き出して、pythonサブプロセスから実行してシェルから実行する間のenvの違いを検出できるかどうかを調べました。唯一の違いは、3ではなくSHLVL = 4であり、PWDは異なっています。それだけです、それ以外のものはまったく同じです。 – Shavais

答えて

0

Stack Overflowは私自身の質問に5時間以上答えることはできないので、この「回答」は最初は編集として追加されました。 (それも私にチャットをさせませんでしたので、コメントはちょっと伸びました。)

問題が見つかりました。問題は、jsminの入力ファイルを作成し、jsminを呼び出しているpythonプログラムでありました。ファイルを作成していましたが、ファイルを閉じずに(まだ)jsminを呼び出していませんでした。だから、jsminは早期に終了していなかったし、出力が切り捨てられていなかった。むしろ、(まだ)不完全な入力ファイル上で動作していました。私は、pythonプログラムが最終的にjsminの入力ファイルを終了していたことを除いて、これよりずっと前にこれを実現していたでしょう。 jsminがそれを処理していた時点では完了していないということだけです。

この非常に事は「と」イディオムのための動機の一つである:

with open(targetpath, 'w+') as targetfile: 
    ..code that writes to targetfile