5

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

# a.py
d = {}
if __name__ == "__main__":
    d['arg'] = 'hello'

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

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

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

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

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

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

4

2 回答 2

1

会不会这么直截了当?我几乎是偶然发现了这个解决方案。

$ python3 b.py foo
{'arg': 'foo'}

似乎即使从命令行调用它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'}
于 2019-04-19T03:37:18.637 回答
0

对于像我这样偶然发现这篇文章的人,您可以直接传递命令行参数。例如,如果我有

# a.py
import argparse

def parse_args():
    # fmt: off
    parser = argparse.ArgumentParser()
    parser.add_argument("--myvar")
    args = parser.parse_args()
    # fmt: on
    return args

if __name__ == "__main__":
    args = parse_args()
    print(args.myvar)
# b.py

import runpy
runpy.run_path(path_name='a.py', run_name="__main__")

我明白了

$ python a.py 
None
$ python a.py --myvar test
test
$ python b.py 
None
$ python b.py --myvar test
test
于 2022-02-07T16:07:24.730 回答