2

subprocess.Popen() 允许您通过“可执行”参数传递您选择的外壳。
我选择通过“/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
4

2 回答 2

4

让您的生活更轻松:

subprocess.Popen(['/bin/tcsh', '-f', '-c', 'echo hi'],
    shell=False, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
于 2013-04-03T08:21:03.273 回答
1

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

但是 - 我知道你没有正确使用你的 Popen。

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

所以cmd = ["echo hi"]应该是cmd = "echo hi"或者cmd = ["echo", "hi"]

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


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


要将整个事情放在一起,您应该运行以下内容:

proc = subprocess.Popen('/bin/tcsh -f -c "echo hi"', shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
于 2013-04-03T08:15:59.967 回答