假设您有一个包含Python脚本路径的字符串,并且您希望以透明的方式加载和执行该脚本(因此与通过“python path”直接运行相比,内部脚本没有根本区别) 。然后得到由此产生的全局字典。我认为runpy.run_path()会这样做,但有两个问题。如果路径包含某个unicode字符,则它不起作用(请参阅http://bugs.python.org/issue17588)。最重要的是,鉴于全局字典只是原始字典的副本,因为当临时模块对象被垃圾收集时,这个原始字典被清除。所以函数对象已经损坏__globals__ dict(参见http://bugs.python.org/issue18331)。
您对如何运行内部脚本有任何想法吗?
更新:查看我当前的方法 - http://bpaste.net/show/RzAbQxLNXiJsXYm2fplz/。有什么建议?改进?例如,关于正在运行的脚本的观点可能有什么不同的细节。我知道重写__main __。
的问题答案 0 :(得分:1)
导入模块执行顶层代码,该模块的“全局”命名空间作为模块名称导入
james@bodacious:~$cat test.py
def func():
pass
myname = "michael caine"
print "hello, %s" % myname
james@bodacious:~$python
Python 2.7.5 (default, Jul 12 2013, 18:42:21)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
hello, michael caine
>>> dir(test)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'func', 'myname']
>>>
如果要运行的代码位于文件的顶层,只需导入模块就会执行代码和,让您可以在一个方便的包中访问其“全局”命名空间。如果您要运行的代码不在顶层(例如,如果它在main()
函数中仅通过常见的if __name__=="__main__"
技巧触发),您可以自己调用该函数:< / p>
james@bodacious:~$cat test.py
def main():
print "hello there!"
if __name__=="__main__":
main()
james@bodacious:~$python
Python 2.7.5 (default, Jul 12 2013, 18:42:21)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.main()
hello there!
>>>
当然,您要导入的文件可能不在sys.path中,因此不能简单地加载import
。一个简单的解决方案可能是操纵sys.path
,但How to import a module given the full path?使用imp.load_source()
描述更好的解决方案