在Pythonterminal上使用subprocess执行命令

我想在linuxterminal上使用python脚本执行以下命令

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

这个命令给出了影响“work”目录中的文件的最后两个标签之间的变更集

我试过了:

 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'])) 

错误:

 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()

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

如何使用subprocess执行该命令?

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

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

说明

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

 hg log -r something hg "log" "-r" "something" 

在您的具体情况下,shell中的原始版本必须用双引号括起来,因为它有括号,而且在bash中有特殊含义。 在Python中,这是不必要的,因为你用单引号括起来。