os.system() 在 Python 中失败

0 投票
3 回答
1674 浏览
提问于 2025-04-17 12:42

我正在用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 个回答

1

不要使用 os.system。应该使用 subprocess 模块

os.system 的说明中提到:

subprocess 模块提供了更强大的功能,可以创建新的进程并获取它们的结果;使用这个模块比使用这个函数更好。

试试这个:

subprocess.check_call(['gnuplot', 'test.gnuplot'])
2

这个警告是打印到错误输出(stderr)上的吗?是不是被某种方式拦截了?

可以试试用subprocess模块,举个例子可以这样使用:

subprocess.check_output(cmd, stderr=subprocess.STDOUT) 

然后检查一下输出。

(或者用subprocess.call可能比os.system更有效)

2

结果发现问题出在我之前没提到的地方。之前在脚本中写了test.gnuplot和test.data这两个文件,但我忘了调用文件对象的close(),也没确认它们是否真的关闭了(现在还不知道怎么确认这一点,所以目前它们会循环一段时间)。这导致了一些意想不到的情况,导致gnuplot看到两个无法读取的文件,没采取任何行动,也没有输出,最后返回了0。

我想这个问题是没人能得分的。

补充:在strace的帮助下,我终于搞明白了。之前我根本不知道怎么做,直到我学会了如何使用它

撰写回答