我想从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有什么问题。
答案 0 :(得分: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"])
虽然可以通过传递shell=True
来打开shell处理,但不建议出于上述原因。
答案 1 :(得分: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"])
答案 2 :(得分:0)
我很确定你的解析错误来自rank
,而不是来自你的os.system命令,因为看起来并不奇怪。如果您手动运行rank
会发生什么?
subprocess
似乎与'〜'有问题,虽然我不能立即确定原因。放完整个路径它应该可以工作(尽管如果它确实是rank
的问题,你可能会得到解析错误。)