問題タブ [subprocess]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
6 に答える
19117 参照

python - FFMPEGおよびPythonsサブプロセス

のGUIを作成しようとしていFFMPEGます。私はpythonsサブプロセスを使用して、必要なすべての変換に対してffmpegプロセスを作成しています。これは問題なく動作しますが、失敗したかどうかなど、変換の進行状況を取得する方法も必要です。次のようにプロセスの標準にアクセスすることで、これを実行できると考えました。

呼び出しsubprocess.Popen()

そして読んでstdout

これは機能しますが、ffmpegのステータスは表示されません。私はそれがffmpegがそれをリフレッシュする方法と関係があると思います。アクセスする方法はありますか?

0 投票する
1 に答える
1752 参照

python - Python を使用してコマンド ラインの最大長をプログラムで決定する

Pythonがシステムの最大コマンドライン長を決定するための移植可能な方法を知っている人はいますか? 私が取り組んでいるプログラムは、コマンドを作成し、それをサブプロセスにフィードします。コマンド ラインの最大長が短いシステムでは、コマンドが長くなりすぎる可能性があります。それを検出できれば、コマンドを分割して最大長を超えないようにすることができますが、最大長を決定する (移植可能な) 方法は見つかりませんでした。

0 投票する
1 に答える
988 参照

subprocess - Drools SubProcess アウト マッピングに失敗しました - 何が間違っていますか?

subProcess ノードに回転を与えるために、2 つの「Hello World」プロセスを作成しました。サブプロセスからメイン プロセスに出力を戻すのに問題があります。私がうまくいかない理由を明らかにするドキュメントや例が見つからないので、誰かが私が間違っていることを教えてくれることを願っています。

私の主なプロセスには、次のものがあります (ヘッダー、フッター、および位置 x、y、高さ、幅の属性を省略していることに注意してください)。

そしてsubhello、これは単純な SubProcess です。単純に入力を取得して出力し、入力の長さを取得してそれを返します。

これは、ドキュメントと例をどのように解釈したかによるものです。必要な変数はメイン プロセスとサブプロセスの両方で宣言され、サブプロセスの in/out マッピング要素を使用して from 属性と to 属性を設定します。

問題は....問題nameなくサブプロセスに渡されたがlength、メインプロセスに戻ろうとして失敗したことです。サブプロセスのlengthが正常に変更されました。しかし、終了時lengthに、メイン プロセスは変更されませんでした。

私は何を間違っていますか?ポインタと説明は大歓迎です。ありがとう。

0 投票する
1 に答える
1122 参照

python - 無期限に実行される Popen から部分的な stdout と stderr を取得します

重複の可能性:
C または Python で popen を使用してサブプロセス出力のバッファリングをバイパスする

無期限に実行する必要があるサーバー コマンド ライン スクリプトのラッパーを作成しています。私がする必要があるのは、サブプロセスが終了するのを待たずに現在のスタウトを取得することです。

つまり、次を実行すると、すべて正常に動作します。

しかし、無期限に実行中のプログラムで同じことを行うと、次のようになります。

それは戻ってこない...

更新:偶数

ハング...

OSに依存しない方法でPopen(または同様のスレッド実装)から部分的な出力をキャプチャする方法があるかどうか知っていますか?

0 投票する
4 に答える
5181 参照

python - Python、サブプロセス、devenv、出力がないのはなぜですか?

Python スクリプトから Visual Studio ソリューションを構築します。ビルド出力をキャプチャできないことを除いて、すべてがうまく機能します。

ここで、outerrは常に空です。に見られるように、これはビルドの成功に関係なく発生しp.returncodeます。

0 投票する
1 に答える
2547 参照

python - 回避策が必要です: Python の select.select() はサブプロセスの stdout で動作しませんか?

マスター python プログラム内から、次のコードで子プログラムを生成しています。

FWIW、子はPythonプログラムとやり取りする必要があるPHPスクリプトです。

マスター python プログラムは、実際には他のいくつかのチャネルからの通信をリッスンする必要があります。同じコードを使用して生成された他の PHP スクリプト、または からのソケット オブジェクトですsocket.accept()select.select()ソースの。

私が抱えている問題は、select.select()Windows ではサブプロセスの stdout ファイル記述子 (これは文書化されています) で動作しないことです。

  • A) PHP スクリプトをポーリングして、stdout に何かが書き込まれているかどうかを確認します。(このシステムは非常に応答性が高い必要があります。1 秒あたり少なくとも 1,000 回ポーリングする必要があります!)
  • B) PHP スクリプトをマスター プロセスに接続し、stdout/stdin の代わりにソケットを介して通信します。

システムをそれほど頻繁にポーリングすることはできないため、おそらく解決策(B)を使用しますが、標準出力/標準入力がうまく機能したときにソケットに再接続するのはリソースの悲しい無駄のようです。

stdoutと を使用できる代替ソリューションはありselect.select()ますか?

0 投票する
4 に答える
16824 参照

python - Python commands.getstatusoutput() でステータス コードを解釈する方法

関連する質問で、C 関数「待機」のドキュメントがどこにあるかを尋ねました。これは、commands.getstatusoutput() モジュールのリターン コードを把握するための試みでした。Stackoverflow は成功しましたが、ドキュメントは役に立ちませんでした。これが私を困惑させるものです:

OS X (Leopard) で実行すると、次の出力が得られます: (これはドキュメントと一致します。)

OS X では、「ls /fail ; echo $?」を実行します。次の出力を取得します。

Linux (Ubuntu Hardy) で実行すると、次の出力が得られます。

Ubuntu では、「ls /fail」を実行すると 2 が返されます。

つまり、Python はステータス コードを 256 倍しているように見えます。これはどこかに文書化されていますか?

0 投票する
2 に答える
937 参照

python - os.popen サブプロセスの変換

このスニペットは、BSD ネットワーク インターフェイスの点線クワッドを取得します。代わりに subprocess モジュールを使用する方法を理解したいと思います。

サブプロセスをまったく同じように使用できないようです。shell=True や PIPE は必要ないと思います。出力をインデックス可能にするにはどうすればよいですか?

ありがとう。

0 投票する
11 に答える
24822 参照

python - ブロック-Pythonサブプロセスパイプラインに入力を送信します

私はPythonでサブプロセスパイプラインをテストしています。以下のプログラムがPythonで直接実行できることは承知していますが、それは重要ではありません。パイプラインをテストしたいので、使用方法を知っています。

私のシステムはLinuxUbuntu9.04で、デフォルトはpython2.6です。

私はこのドキュメントの例から始めました。

それは機能しますが、p1'sstdinはリダイレクトされていないため、パイプにフィードするためにターミナルに入力する必要があります。^D終了stdinと入力すると、必要な出力が得られます。

ただし、Python文字列変数を使用してパイプにデータを送信したいと思います。最初に私はstdinに書いてみました:

動作しませんでした。p2.stdout.read()最後の行で代わりに使用してみましたが、ブロックされます。追加p1.stdin.flush()しましp1.stdin.close()たが、どちらも機能しませんでした。それから私はコミュニケーションに移りました:

だから、それはまだそれではありません。

単一のプロセスの実行(p1上記のように、削除p2)が完全に機能することに気づきました。p1また、ファイルハンドルを( )に渡すこともできますstdin=open(...)。したがって、問題は次のとおりです。

ブロッキングせずに、Pythonで2つ以上のサブプロセスのパイプラインにデータを渡すことは可能ですか?なぜだめですか?

シェルを実行してパイプラインをシェルで実行できることは承知していますが、それは私が望んでいることではありません。


更新1:以下のAaron Digullaのヒントに従って、スレッドを使用して機能させようとしています。

まず、スレッドでp1.communicateを実行してみました。

さて、動作しませんでした。に変更するなど、他の組み合わせも試してみまし.write()p2.read()。何もない。次に、反対のアプローチを試してみましょう。

コードはどこかでブロックされてしまいます。生成されたスレッド、メインスレッド、またはその両方。だからそれはうまくいきませんでした。それを機能させる方法を知っているなら、機能するコードを提供できればもっと簡単になるでしょう。私はここで試しています。


更新2

Paul Du Boisがいくつかの情報で以下に答えたので、私はさらにテストを行いました。モジュール全体を読み、subprocess.pyそれがどのように機能するかを理解しました。だから私はそれをコードに正確に適用してみました。

私はLinuxを使用していますが、スレッドを使用してテストしていたため、最初のアプローチは、subprocess.pycommunicate()メソッドで見られる正確なWindowsスレッドコードを複製することでしたが、1つではなく2つのプロセスでした。これが私が試したものの完全なリストです:

上手。うまくいきませんでした。p1.stdin.close()呼び出された後も、p2.stdout.read()まだブロックします。

次に、posixコードを試してみましたsubprocess.py

また、をブロックしselect.select()ます。sを広めることによってprint、私はこれを見つけました:

  • 読書は機能しています。コードは実行中に何度も読み取ります。
  • ライティングも機能しています。データはに書き込まれp1.stdinます。
  • の終わりにnumwritesp1.stdin.close()が呼び出されます。
  • select()ブロックを開始すると、何かしかありto_readませんp2.stdoutto_writeすでに空です。
  • os.read()callは常に何かを返すため、p2.stdout.close()呼び出されることはありません。

両方のテストからの結論stdin:(例では)パイプラインの最初のプロセスを閉じることはgrep、バッファリングされた出力を次のプロセスにダンプして死ぬことにはなりません。

それを機能させる方法はありませんか?

PS:一時ファイルは使いたくありません。すでにファイルでテストしていて、動作することはわかっています。そして、私はウィンドウを使いたくありません。