「入力行が長すぎます」というエラーメッセージはどうすればよいですか?
-
22-08-2019 - |
質問
os.system()を使用して、入力ファイルと出力ファイルを受け取る別のプログラムを呼び出そうとしています。私が使用するコマンドは、フォルダー名が長いため、約250文字です。
コマンドを呼び出そうとすると、エラーが発生します:The input line is too long
。
255 character limit
があると思います(Cシステムコールを使用して構築されていますが、その制限も見つかりませんでした)。
フォルダトレイルの長さを短くするためにos.chdir()
でディレクトリを変更しようとしましたが、os.system()
で"..\folder\filename"
を使用しようとすると、相対パス名を処理できないようです。この制限を回避したり、相対パスを認識させたりする方法はありますか?
解決
代わりにサブプロセスモジュールを使用する必要があります。サブプロセスを使用するようにos.system呼び出しを書き直す方法については、
他のヒント
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コメント。
これらは機能するので注意してください: ジェネラコディセタグプレ
ただし、これらは機能しません: ジェネラコディセタグプレ
必要なときに引用符を追加する関数が必要な場合は、 http://github.com/ssbarnea/tendo/blob/master/tendo/tee.py
os.systemの代わりに
サブプロセスには、ディレクトリを変更できるという利点があります。 ジェネラコディセタグプレ
上記が少し冗長に見える場合、サブプロセスモジュールにはいくつかのヘルパー関数も含まれています。
ウィンドウを使用していると仮定すると、バックスラッシュから、Pythonから.batファイルを記述し、その上にos.system()
を書き込むことができます。それはハックです。
文字列で「\」を使用している場合は、文字列が適切にエスケープされていることを確認してください。
Pythonはエスケープ文字として「\」を使用します。エスケープされたfはまだfであるため、文字列"..\folder\filename"
は"..folderfilename"
に評価されます。
おそらく使用したい ジェネラコディセタグプレ
または ジェネラコディセタグプレ
同じメッセージが表示されましたが、コマンドがそれほど長くなく(130文字)、以前は機能していたため、ある日機能しなくなったため、奇妙でした。 コマンドウィンドウを閉じて新しいウィンドウを開くと、機能しました。 コマンドウィンドウを長い間開いていました(おそらく数か月、リモート仮想マシンです)。 バッファか何かのWindowsのバグだと思います。