为什么cat工作和文件打开对象不?

时间:2014-02-01 07:30:39

标签: python subprocess file-descriptor

为什么这样做:

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!

1 个答案:

答案 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