为什么这样做:
diff = subprocess.Popen(['cat','foo.txt'], stdout=subprocess.PIPE)
pr = subprocess.Popen(sublime, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, stdin=diff.stdout)
pr.wait()
if pr.returncode == 0:
msg = pr.stdout.read()
print "message : %s" % msg
er = pr.stderr.read()
print er
但这不是:
diff = subprocess.Popen('open("foo.txt","r")', stdout=subprocess.PIPE)
我正在尝试从命令行终端启动sublime,并将在sublime中输入的文本传递给变量。
让我感到困扰的是我可以通过第一个来实现,但它不适用于Windows!
答案 0 :(得分:3)
因为cat
是 shell 命令,但open
是Python函数。带有subprocess
的{{1}}调用类似bash的东西(和shell=True
一样,它大致与bash一样,但用更少的额外解析) - 所以,基本上,它可以运行任何命令你可以直接在终端中运行而不必先打开另一个进程(如Python解释器)。你可以做类似的事情:
shell=False
但这有点荒谬。
第一个代码在Windows上不起作用的原因是Windows没有subprocess.POpen(r'python -c "open(\"foo.txt\", \"r\")', stdout=subprocess.PIPE)
命令。但是你可以做你想要实现的目标而不需要调用任何其他子进程而不是sublime - 实际上,相当于执行cat
而不是sublime < foo.txt
。
为此,请将文件中的数据读入变量 first ,然后使用cat foo.txt | sublime
将其发送到子流程:
communicate