你不能“调用它的主函数”,因为它没有主函数。
事实上,通常的处理方法是将所有这些代码移到一个函数中,然后使
__main__
警戒代码就是这么叫的:
def main(args):
for key in args:
print(key)
if __name__ == '__main__':
main(sys.argv)
那么你
可以
调用它的主函数,向它传递任何需要的参数。
但如果你不能修复文件,那就行不通了。
那么,什么
可以
你呢?这完全取决于你到底需要如何遵循惯例
python another.py
语义学。
快速肮脏的方法是
blhsing's answer
建议:阅读文件,然后
exec
它和
globals
从你自己的剧本:
with open('another.py') as f:
exec(f.read(), globals())
注意,这将离开
sys.argv
原封不动。当然,您可以先手动将其设置为其他值:
_argv = sys.argv
sys.argv = ['args', 'i', 'want', 'it', 'to', 'see']
try:
with open('another.py') as f:
exec(f.read(), globals())
finally:
sys.argv = _argv
如果您是从另一个模块(而不是从顶级脚本)执行此操作,则此操作将不起作用,但稍作修改后,它将:
with open('another.py') as f:
exec(f.read(), sys.modules['__main__'].__dict__)
但是最好创建一个干净的全局命名空间。脚本可能不希望你的globals坐在周围,它可能会改变你不希望它改变的事情。这同样简单:
with open('another.py') as f:
exec(f.read(), {})
(注意,这仍然会自动继承当前的
builtins
,这是你通常想要的。如果你
不要
想知道为什么,看
执行官
文档。)
如果要保证执行它的方式与正常运行脚本的方式完全相同,请使用
runpy
模块。
当你跑的时候
python -m another
,它最终要做的是:
runpy.run_module(sys.argv[0], run_name="__main__", alter_sys=True)
因此,您可以手动执行相同的操作:
runpy.run_module('another', run_name='__main__')
是否要添加
alter_sys=True
取决于你在追求什么。如果脚本试图访问
系统参数
(就像你的剧本一样)或者
sys.modules['__main__']
,它将看到你的价值观,而不是自己的价值观。
如果你想效仿
python另一个.py
,您需要使用
importlib
创建完整的
__spec__
以及相关对象,然后调用
runpy.run_path
.