10

os.system() を使用して、入力ファイルと出力ファイルを受け取る別のプログラムを呼び出そうとしています。フォルダー名が長いため、使用するコマンドは最大 250 文字です。

コマンドを呼び出そうとすると、エラーが発生します: The input line is too long.

あると思います255 character limit(Cシステムコールを使用して構築されていますが、その制限も見つかりませんでした)。

os.chdir()フォルダのトレイルの長さを減らすためにディレクトリを変更しようとしましたが、それを使用しようとするos.system()"..\folder\filename"、相対パス名を処理できないようです。この制限を回避したり、相対パスを認識させる方法はありますか?

4

6 に答える 6

20

を使用することをお勧めしますsubprocess.Popen()が、これでは問題は解決しません。

あなたの問題は 255 文字の制限ではありません。これは DOS 時代に当てはまり、後に Windows NT/2000 では 2048 に増加し、Windows XP+ では 8192 に再び増加しました。

本当の解決策は、Windows API の非常に古いバグである_popen() および _wpopen()を回避することです。

コマンド ラインで引用符を使用する場合は、コマンド全体を引用符で囲む必要があります。そうしないと、The input line is too longエラー メッセージが表示されます。

Windows XP 以降のすべての Microsoft オペレーティング システムには 8192 文字の制限がありましたが、これは適切なコマンド ラインの使用には十分ですが、このバグを解決するのを忘れていました。

彼らのバグを克服するには、コマンド全体を二重引用符で囲みます。さらに詳しく知りたい場合は、_popen() に関する MSDN コメントを参照してください

これらは機能するため、注意してください。

prog
"prog"
""prog" param"
""prog" "param""

しかし、これらは機能しません:

""prog param""

必要なときに引用符を追加する関数が必要な場合は、 http: //github.com/ssbarnea/tendo/blob/master/tendo/tee.pyから取得できます。

于 2010-08-27T10:29:48.790 に答える
6

代わりに subprocess モジュールを使用する必要があります。サブプロセスを使用するように os.system 呼び出しを書き直す方法については、この小さなドキュメントを参照してください。

于 2009-03-25T18:15:37.307 に答える
2

os.system の代わりにsubprocessを使用する必要があります。

subprocess には、ディレクトリを変更できるという利点があります。

import subprocess
my_cwd = r"..\folder\"
my_process = subprocess.Popen(["command name", "option 1", "option 2"], cwd=my_cwd)
my_process.wait() # wait for process to end
if my_process.returncode != 0:
    print "Something went wrong!"

上記が少し冗長に見える場合は、 subprocess モジュールにもいくつかのヘルパー関数が含まれています。

于 2009-03-25T18:38:58.123 に答える
1

同じメッセージが表示されましたが、コマンドがそれほど長くなく (130 文字)、以前は機能していたため、奇妙でした。ある日、機能しなくなりました。コマンドウィンドウを閉じて新しいウィンドウを開いたところ、うまくいきました。コマンド ウィンドウを長い間開いていました (おそらく数か月、リモート仮想マシンです)。バッファか何かに関するいくつかのウィンドウのバグだと思います。

于 2010-12-07T15:52:02.937 に答える
1

バックスラッシュから、Windows を使用していると仮定すると、python から .bat ファイルを作成し、その上に書き込むことができますos.system()。ハックです。

于 2009-03-25T18:11:08.567 に答える
1

文字列で「\」を使用しているときは、それらが適切にエスケープされていることを確認してください。

Python は '\' をエスケープ文字として使用するため、エスケープされた f は依然として f であるため、文字列"..\folder\filename"は に評価されます。"..folderfilename"

あなたはおそらく使いたい

r"..\folder\filename"

また

"..\\folder\\filename"
于 2009-03-25T18:13:55.983 に答える