2

我想从 python 代码中多次调用一个程序,并将该程序的输出保存在一个文本文件中。我现在的第一个问题就是调用其他代码。我必须重定向到不同的目录并在 output.txt 上调用 ./rank。这就是我尝试这样做的方式:

    TheCommand = "~/src/rank-8-9-2011/rank output.txt"
    os.system(TheCommand)

但我得到一个解析错误。

 [Parsing error on line ]Unknown error: 0

我在 Mac OS 10.5.8 上运行 python2.7。我不确定问题是什么。我也尝试使用子进程:

 subprocess.call(["~/src/rank-8-9-2011/rank", "output.txt"])

这没有找到目录(我有一种感觉我错误地使用了子进程),但我不知道os.system有什么问题。

4

3 回答 3

5

第一个参数中的程序名称subprocess.Popen不能包含~,因为它不会将字符串传递给 shell 进行处理(这就像总是在 sql 中使用参数化查询一样,保护一个免受字符串注入攻击,例如,如果不是output.text一个有;rm -rf /,系统版本会运行rank然后运行rm -rf .,但subprocess.Popen只会rank打开一个名为;rm -rf .) 的文件,因此应该通过调用来扩展它os.path.expanduser

subprocess.Popen([os.path.expanduser('~/src/rank-8-9-2011/rank'), "output.txt"])

虽然可以通过 pass 开启 shell 处理shell=True,但由于上述原因不建议这样做。

于 2011-09-20T17:28:05.097 回答
2

你应该试试http://docs.python.org/library/os.path.html#os.path.expanduser

import os.path
subprocess.call([os.path.expanduser("~/src/rank-8-9-2011/rank"), "output.txt"])
于 2011-09-20T17:24:54.430 回答
0

我相当确定您的解析错误来自rankos.system 命令,而不是来自您的 os.system 命令,因为那里没有什么奇怪的。如果rank手动运行会发生什么?

subprocess'~' 似乎有问题,尽管我不确定为什么。输入完整路径,它应该可以工作(尽管如果确实存在问题,您可能会收到该解析错误rank)。

于 2011-09-20T17:19:19.160 回答