当我调用其中包含打印语句的 python 脚本时,SCons 会生成损坏的目标

When I invoke python script with a print statement in it, SCons generates a corrupt target

我对如何从 Python 脚本构建或者为什么 SCons 构建不正确感到有点困惑。

一个愚蠢但最小(不是)的工作示例:

我有一个 Python 脚本,plot.py:

import matplotlib.pyplot as plt

fig, ax = plt.subplots( nrows=1, ncols=1 ) 
ax.plot([0,1,2], [10,20,3])
print 'Doing some stuff...'
fig.savefig('figure.png')   

如果我 运行 终端中的脚本 $ python plot.py 它会创建一个漂亮的图像文件,但如果从 SCons 调用脚本,它会创建一个无法打开的损坏文件。但是,它的大小似乎与应有的大小相同。

import os
env = Environment(ENV = os.environ)
env.Command('figure.png', 'plot.py', 'python $SOURCE > $TARGET')

如果我将目标指定为 $ scons figure.png,结果是相同的。清理和重建 (scons -c) 无济于事。我没有收到错误消息。

$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
python plot.py > figure.png
scons: done building targets.

据我所知,调试看起来不错:

+-.
  +-SConstruct
  +-figure.png
  | +-plot.py
  | +-/Users/tobiasstal/anaconda/bin/python
  +-plot.py

但是,有趣的是,如果我删除 print 语句,它就会起作用。

import matplotlib.pyplot as plt
import time

fig, ax = plt.subplots( nrows=1, ncols=1 ) 
ax.plot([0,1,2], [10,20,3])
time.sleep(3)
# print 'Doing some stuff...'
fig.savefig('figure.png')  

此外,如果我 运行 上面的 Python 脚本直接在 SConstruct 文件中,它会正确保存图形。

我做错了什么?如何从 SCons 调用 Python 脚本来生成工作目标,即使脚本中有打印语句?

使用 OS 10.11.6 Python 2.7 SCons 2.5.0

假设您的 python 脚本写入了目标,然后您创建了重定向到同一目标的输出,那么您得到一个损坏的文件也就不足为奇了...

import os
env = Environment(ENV = os.environ)
env.Command('figure.png', 'plot.py', 'python $SOURCE > $TARGET')

您可以从命令字符串中省略“> $TARGET”。或者修改您的脚本以获取目标文件的参数并将您的 SCons 逻辑更改为

import os
env = Environment(ENV = os.environ)
env.Command('figure.png', 'plot.py', 'python $SOURCE $TARGET')