2

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

しかし、それらのことはどれも当てはまらないようです。終了値は、出力が切り捨てられている場合でもmain()から返すものであり、fflush(stdout)の呼び出しを追加しても違いはなく、jsminを呼び出した後に同じサブシェル内からsyncを呼び出しても効果はありません。違いはありません。

putc()の呼び出しをfputc()の呼び出しに置き換えてみましたが、最初は問題が解決したように見えましたが(なんらかの理由で?)、不可解なことに、問題が再び発生し始め、現在は確実に発生しています。ビザレ?

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

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

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

(パスにjsminを入れて実行しているので、期待される結果のほとんどが.minファイルで取得されます。)

誰かがこの問題を引き起こしている可能性があるものを想像できますか?

4

1 に答える 1

0

Stack Overflowでは、自分の質問に5時間ほど答えることができなかったため、この「回答」は元々編集として追加されました。(それでも私はチャットできなかったので、コメントは少し伸びました。)

問題を見つけました。問題は、jsminの入力ファイルを作成し、その上でjsminを呼び出すPythonプログラムにありました。それはファイルを作成し、それを(まだ)閉じることができず、それからそのファイルに対してjsminを呼び出していました。したがって、jsminは早期に終了していませんでした。また、出力が切り捨てられていませんでした。むしろ、(まだ)不完全な入力ファイルで動作していました。(ええと)

pythonプログラムが最終的にjsminの入力ファイルを(終了することによって)閉じていたのを除いて、私はこれを私よりずっと早く気づいたでしょう、それで私がそれを調べていた時までに、それは完全に見えました。jsminが処理するまでに完了していなかっただけです。

これこそが、「with」イディオムの動機の1つです。

with open(targetpath, 'w+') as targetfile:
   ..code that writes to targetfile
于 2012-04-22T21:34:43.093 に答える