当我调用其中包含打印语句的 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')
我对如何从 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')