1

タイトルの内容:

  1. subprocessモジュールは2.4および2.5で動作するため、使用できません。
  2. 引数を渡すためにシェルプロセスを生成しないでください。

(2)を説明するために、次のコードを検討してください。

>>> x=os.system('foo arg')
sh: foo: not found
>>> x=os.popen('foo arg')
sh: foo: not found
>>> 

ご覧のとおり、システムシェル( "sh")を介して、指定されたコマンド( "foo")を表示os.systemして実行します。os.popen私はこれが起こらないようにしたいです(そうでなければ、醜い「見つかりません」メッセージが私の制御なしでプログラムstderrに出力されます)。

最後に、このプログラムに引数を渡すことができるはずです(上記の例では「arg」)。

Python 2.5および2.4でこれを行うにはどうすればよいですか?

4

2 に答える 2

3

おそらく、Python2.4で利用可能なサブプロセスモジュールを使用する必要があります

Popen("/home/user/foo" + " arg")

>>> Popen("foo arg", shell=False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/subprocess.py", line 595, in __init__
    errread, errwrite)
  File "/usr/lib/python2.6/subprocess.py", line 1092, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

シェルを使用していないため、フルパスを含める必要があります。

http://docs.python.org/library/subprocess.html#replacing-os-system

または、subprocess.PIPEをstderrとstdoutに渡して、メッセージを抑制することもできます。詳細については、上記のリンクを参照してください。

于 2009-09-10T22:11:33.247 に答える
0

前に説明したように、サブプロセスモジュールを使用できます(使用する必要があります) 。

デフォルトでは、shellパラメータはFalseです。これは良いことで、とても安全です。また、フルパスを渡す必要はありません。実行可能ファイル名と引数をシーケンス(タプルまたはリスト)として渡すだけです。

import subprocess

# This works fine
p = subprocess.Popen(["echo","2"])

# These will raise OSError exception:
p = subprocess.Popen("echo 2")
p = subprocess.Popen(["echo 2"])
p = subprocess.Popen(["echa", "2"])

サブプロセスモジュールですでに定義されている次の2つの便利な関数を使用することもできます。

# Their arguments are the same as the Popen constructor
retcode = subprocess.call(["echo", "2"])
subprocess.check_call(["echo", "2"])

stdoutリダイレクトおよび/またはstderrにリダイレクトできるPIPEため、画面に出力されないことを忘れないでください(ただし、出力はPythonプログラムで読み取ることができます)。デフォルトでは、stdoutstderrは両方ともですNone。これは、リダイレクトがないことを意味します。つまり、Pythonプログラムと同じstdout/stderrを使用します。

また、を使用shell=TrueしてリダイレクトすることもできますstdoutstderrPIPEに送信されるため、メッセージは出力されません。

# This will work fine, but no output will be printed
p = subprocess.Popen("echo 2", shell=True,
    stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# This will NOT raise an exception, and the shell error message is redirected to PIPE
p = subprocess.Popen("echa 2", shell=True,
    stdout=subprocess.PIPE, stderr=subprocess.PIPE)
于 2009-09-10T23:25:52.970 に答える