os.system() 在 Python 中失败
我正在用Python解析一些数据并制作图表,但遇到了一个奇怪的问题。调用 os.system()
的时候,似乎有些东西丢失了。
以下三行代码:
os.system('echo foo bar')
os.system('gnuplot test.gnuplot')
os.system('gnuplot --version')
应该打印出:
foo bar
Warning: empty x range [2012:2012], adjusting to [1991.88:2032.12]
gnuplot 4.4 patchlevel 2
但是中间的那个重要命令似乎没有执行。脚本仍然能运行echo和版本检查,而且单独运行 gnuplot
(gnuplot命令行)也能正常工作,但从gnuplot没有任何警告,也没有输出文件。
为什么这个命令会被丢掉,而且完全没有任何提示呢?
如果有帮助的话,这个命令应该是启动gnuplot,打开几个文件(指示中的说明文件和数据文件),并输出到一个SVG文件。我尝试删除目标文件,这样就不需要覆盖,但还是没有用。
这是在Ubuntu Natty x86_64虚拟机上运行的Python 3.2,内核版本是2.6.38-8-virtual。
3 个回答
不要使用 os.system
。应该使用 subprocess
模块。
os.system
的说明中提到:
subprocess 模块提供了更强大的功能,可以创建新的进程并获取它们的结果;使用这个模块比使用这个函数更好。
试试这个:
subprocess.check_call(['gnuplot', 'test.gnuplot'])
这个警告是打印到错误输出(stderr)上的吗?是不是被某种方式拦截了?
可以试试用subprocess模块,举个例子可以这样使用:
subprocess.check_output(cmd, stderr=subprocess.STDOUT)
然后检查一下输出。
(或者用subprocess.call可能比os.system更有效)
结果发现问题出在我之前没提到的地方。之前在脚本中写了test.gnuplot和test.data这两个文件,但我忘了调用文件对象的close()
,也没确认它们是否真的关闭了(现在还不知道怎么确认这一点,所以目前它们会循环一段时间)。这导致了一些意想不到的情况,导致gnuplot看到两个无法读取的文件,没采取任何行动,也没有输出,最后返回了0。
我想这个问题是没人能得分的。
补充:在strace
的帮助下,我终于搞明白了。之前我根本不知道怎么做,直到我学会了如何使用它。