2 回答
TA贡献1862条经验 获得超6个赞
主要问题
b.py您可以使用以下代码覆盖变量:
import a
a.h = 'actually replaced value'
注意:实际上添加它a.py仍然会给出以下结果:
>$ python b.py -h
this is h from a.py
this is h from b.py
创建想要的行为
首先请注意,您可以使用以下代码验证 h 的值是否已更改:
a.py:
import sys
h = 'this is h from a.py'
for i in sys.argv:
if i in ['-h']:
print(h)
def what_is_h():
print('h:', h)
b.py:
import sys
from a import h, what_is_h
import a
what_is_h()
a.h = h = 'this is h from b.py'
what_is_h()
for i in sys.argv:
if i in ['-h']:
print(h)
这导致以下结果:
this is h from a.py
h: this is h from a.py
h: this is h from b.py
this is h from b.py
第一次what_is_h调用显示原始h值,第二次调用显示修改后的值。问题是a.py并且b.py似乎有不同版本的变量h,这就是所谓的范围。当您使用import语句时,python 会解析您的文件并运行代码。防止代码自动运行的方法是将其放在一个函数中,将其导入并运行它,b.py最好将h其作为参数传递(因为全局状态在 python 中通常是不好的做法)。
“如果我也想从其中运行一个函数,a.py但前提是我直接运行它怎么办?”
现在,如果您希望在运行时执行一个函数,a.py或者仅在直接b.py运行该函数a.py时才运行该函数,您可以将以下内容添加到脚本文件的底部:
if __name__ == '__main__':
my_function()
这将my_function仅在您执行时运行该函数$> python a.py。请注意,导入时a.py它不会运行my_function,除非以其他方式运行。
这是如何运作的? __name__是一个内置的全局变量,用于存储 Python 解释器赋予 Python 脚本的“名称”。运行的文件被赋予__name__ '__main__'. a.py __name__现在,当从will导入某些东西时'a',my_function将不会运行。
代码的更多样式注释和提示
平等:
代替
if i in ['-h']:
# ... your code
做
if i == '-h':
# ... your code
如果您想稍后检查多个标志,您可以更改它。
检查某物是否在列表或类似序列的对象中:
如果你只想检查是否-h在sys.args你可以这样做:
if '-h' in sys.args:
# ... your code
代替
for i in sys.args:
if i == '-h':
# ... your code
解析、处理和处理命令行参数
如果你打算用参数做更复杂的事情,那么每次安装 python 时都应该默认包含一个库,即argparse库。
我希望我能提供帮助。
TA贡献1796条经验 获得超4个赞
导入 a 时,会执行 a.py 中的所有代码,因此您将始终获得打印输出:
这是来自 a.py 的 h
为避免这种情况,您可以将 a.py 更改为:
import sys
h = 'this is h from a.py'
if __name__ == '__main__':
for i in sys.argv:
if i in ['-h']:
print(h)
这样,if 子句中的代码只会在您调用时执行python a.py -h,而不是在您调用时执行python b.py -h。
添加回答
举报
