a.py:
import sys
h = 'this is h from a.py'
for i in sys.argv:
if i in ['-h']:
print(h)
b.py:
import sys
from a import h
h='this is h from b.py'
for i in sys.argv:
if i in ['-h']:
print(h)
然后我得到:
>$ python b.py -h
this is h from a.py
this is h from b.py
'h'不应该被覆盖吗?或者a.py是否正在访问给定给b.py的'-h'参数
多谢各位
导入时,将执行a.py中的所有代码,因此您将始终具有打印输出:
要避免此问题,可以将a.py更改为:
这样,if子句中的代码将仅在调用
python a.py -h
时执行,而不是在调用python b.py -h
时执行主要问题
可以使用以下代码覆盖
b.py
中的变量:注意:实际上,将其添加到
a.py
仍然会得到以下结果:创造被通缉的行为
首先请注意,您可以使用以下代码验证h的值是否已更改:
a.py:
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
中运行该函数,则可以将以下内容添加到脚本文件的底部:这将仅在执行
$> python a.py
时运行函数my_function
。 请注意,当导入a.py
时,它将不会运行my_function
,除非以其他方式运行这是怎么回事?}。现在,当从
__name__
是一个内置的全局变量,它存储python解释器给python脚本的“名称”。运行的文件被赋予__name__
{a.py
导入内容时__name__
将等于'a'
,并且my_function
将不会运行关于代码的更多样式注释和提示
而不是
做
如果以后要检查多个标志,可以对其进行更改。
如果只想检查
-h
是否在sys.args
中,可以执行以下操作:而不是
如果您计划使用参数执行更复杂的操作,那么默认情况下,在每次安装python时都应该包含一个库,即argparse库
我希望我能帮上忙
相关问题 更多 >
编程相关推荐