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
答案 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值设置为True
或False
。 True
如果是字符串,False
如果是列表。
“传递”参数是函数的术语,使用Popen,或者子进程模块与函数不同,虽然它们是函数,但实际上是用它们运行命令,而不是在传统中传递参数感觉,所以如果你想用'-f'
运行一个进程,只需将'-f'
添加到要运行命令的字符串或列表中。
要把整个事情放在一起,你应该运行类似的东西:
proc = subprocess.Popen('/bin/tcsh -f -c "echo hi"', shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)