将命令行参数传递给 runpy

hoo*_*rEE 8 python python-3.x

我有两个文件,其中一个有一个我关心的副作用,该副作用发生在if __name__ == "__main__"守卫中:

# a.py
d = {}
if __name__ == "__main__":
    d['arg'] = 'hello'
Run Code Online (Sandbox Code Playgroud)

第二个文件导入第一个文件(使用runpy)并打印字典:

# b.py
import runpy
m = runpy.run_module('a', run_name='__main__')
print(m['d'])  # {'arg': 'hello'}
Run Code Online (Sandbox Code Playgroud)

到目前为止这有效。但现在我想更改第一个文件以接受命令行参数:

import sys
d = {}
if __name__ == "__main__":
    d['arg'] = process(sys.argv[1])
Run Code Online (Sandbox Code Playgroud)

问题是它process()是由其他人编写的,超出了我的控制范围,但我仍然想d在“处理”后获取更新的字典。

我如何sys.argv在调用之前进行模拟runpy,或者以其他方式提供该值a.py

hoo*_*rEE 3

事情能这么简单吗?我几乎是偶然发现了这个解决方案。

$ python3 b.py foo
{'arg': 'foo'}
Run Code Online (Sandbox Code Playgroud)

似乎即使从命令行调用时sys.argv[1]也会传入。ab.py

编辑

这是我的 shell 中的一个示例会话:

me@desktop$ cat a.py b.py
import sys
d = {}
filename = sys.argv[1]
if __name__ == "__main__":
    d['result'] = filename + ' world'


# usage:
# python3 b.py filename
# 'filename' is passed in to the a module
import runpy
aa = runpy.run_module('a', run_name='__main__')
print(aa['d'])  # {}

me@desktop$ python3 b.py hello
{'result': 'hello world'}
Run Code Online (Sandbox Code Playgroud)

  • 也许这在特定的上下文中有效,但是如果我希望“b.py”根据其他逻辑选择要发送到“a.py”的命令行参数怎么办? (2认同)