让Python在我的脚本之前运行几行
问题描述
我需要运行脚本foo.py
,但我还需要在foo.py
中的代码之前插入一些要运行的调试行。目前,我只是将这些行放在foo.py
中,我很小心地不将其提交给Git,但我不喜欢这个解决方案。
我想要的是一个单独的文件bar.py
,我不提交给Git。然后我想运行:
python /somewhere/bar.py /somewhere_else/foo.py
我希望这样做的是首先在bar.py
中运行一些代码行,然后以__main__
的身份运行foo.py
。应该与bar.py
行进入的进程相同,否则调试行将无济于事。
是否有方法使bar.py
执行此操作?
有人建议:
import imp
import sys
# Debugging code here
fp, pathname, description = imp.find_module(sys.argv[1])
imp.load_module('__main__', fp, pathname, description)
问题在于,因为它使用导入机制,所以我需要与foo.py
位于同一个文件夹中才能运行它。我不想这样。我只想输入foo.py
的完整路径。
另外:该解决方案还需要使用.pyc
文件。
解决方案
有一种在启动时运行代码的机制;site模块。
"This module is automatically imported during initialization."
在导入__main__
之前,站点模块将尝试导入名为sitecustomize
的模块。
如果您的环境要求,它还将尝试导入名为usercustomize
的模块。
例如,您可以在包含以下内容的Site-Packages文件夹中放置一个Sitecustomize.py文件:
import imp
import os
if 'MY_STARTUP_FILE' in os.environ:
try:
file_path = os.environ['MY_STARTUP_FILE']
folder, file_name = os.path.split(file_path)
module_name, _ = os.path.splitext(file_name)
fp, pathname, description = imp.find_module(module_name, [folder])
except Exception as e:
# Broad exception handling since sitecustomize exceptions are ignored
print "There was a problem finding startup file", file_path
print repr(e)
exit()
try:
imp.load_module(module_name, fp, pathname, description)
except Exception as e:
print "There was a problem loading startup file: ", file_path
print repr(e)
exit()
finally:
# "the caller is responsible for closing the file argument" from imp docs
if fp:
fp.close()
然后您可以像这样运行脚本:
MY_STARTUP_FILE=/somewhere/bar.py python /somewhere_else/foo.py
- 您可以运行foo.py之前的任何脚本,而无需添加代码重新导入
__main__
。 - 运行
export MY_STARTUP_FILE=/somewhere/bar.py
,无需每次引用
相关文章