使用python中的子进程在linux终端上执行命令

Execute command on linux terminal using subprocess in python

我想使用python脚本在Linux终端上执行以下命令

1
hg log -r"((last(tag())):(first(last(tag(),2))))" work

此命令提供"work"目录中受影响文件的最后两个标记之间的变更集。

我试过:

1
2
3
4
import subprocess
releaseNotesFile = 'diff.txt'
with open(releaseNotesFile, 'w') as f:
    f.write(subprocess.call(['hg', 'log', '-r', '"((last(tag())):(first(last(tag(),2))))"', 'work']))

错误:

1
2
3
4
5
abort: unknown revision '((last(tag())):(first(last(tag(),2))))'!
Traceback (most recent call last):
  File"test.py", line 4, in <module>
    f.write(subprocess.call(['hg', 'log', '-r', '"((last(tag())):(first(last(tag(),2))))"', 'work']))
TypeError: expected a character buffer object

使用os.popen()。

1
2
3
with open(releaseNotesFile, 'w') as file:
    f = os.popen('hg log -r"((last(tag())):(first(last(tag(),2))))" work')
    file.write(f.read())

如何使用子进程执行该命令?


要解决您的问题,请将f.write(subprocess...行更改为:

1
f.write(subprocess.call(['hg', 'log', '-r', '((last(tag())):(first(last(tag(),2))))', 'dcpp']))

解释

当从命令行(如bash)调用程序时,将"忽略""字符。以下两个命令是等效的:

1
2
hg log -r something
hg"log""-r""something"

在您的特定情况下,shell中的原始版本必须用双引号括起来,因为它有圆括号,而那些圆括号在bash中有特殊的含义。在Python中,这是不必要的,因为您使用单引号将它们括起来。