将参数传递给subprocess.Popen()调用的“executable”参数

时间:2013-04-03 08:11:43

标签: python subprocess tcsh

subprocess.Popen()允许您通过“executable”参数传递您选择的shell 我选择传递“/ bin / tcsh”,我不希望tcsh读取我的~/.cshrc
tcsh手册说我需要将-f传递给/bin/tcsh来执行此操作。

如何让Popen用-f选项执行/ bin / tcsh?

import subprocess

cmd = ["echo hi"]
print cmd

proc = subprocess.Popen(cmd, shell=False,  executable="/bin/tcsh", stderr=subprocess.PIPE, stdout=subprocess.PIPE)
return_code = proc.wait()

for line in proc.stdout:
    print("stdout: " + line.rstrip())

for line in proc.stderr:
    print("stderr: " + line.rstrip())

print return_code

2 个答案:

答案 0 :(得分:4)

让您的生活更轻松:

subprocess.Popen(['/bin/tcsh', '-f', '-c', 'echo hi'],
    shell=False, stderr=subprocess.PIPE, stdout=subprocess.PIPE)

答案 1 :(得分:1)

我不明白你的问题标题“将参数传递给子进程可执行文件”与其余部分有什么关系,特别是“我希望tcsh不要读取我的〜/ .cshrc”。

然而 - 我知道你没有正确使用你的Popen。

您的cmd应该是列表或字符串,而不是1个字符串的列表。

因此cmd = ["echo hi"]应为cmd = "echo hi"cmd = ["echo", "hi"]

然后,根据它是字符串还是列表,您需要将shell值设置为TrueFalseTrue如果是字符串,False如果是列表。


“传递”参数是函数的术语,使用Popen,或者子进程模块与函数不同,虽然它们是函数,但实际上是用它们运行命令,而不是在传统中传递参数感觉,所以如果你想用'-f'运行一个进程,只需将'-f'添加到要运行命令的字符串或列表中。


要把整个事情放在一起,你应该运行类似的东西:

proc = subprocess.Popen('/bin/tcsh -f -c "echo hi"', shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)