是否可以从另一个脚本导入函数而不从此类文件导入变量?
Is it possible to import a function from another script without importing the variables from such file?
我有两个脚本 1 和 2,我需要这两个脚本彼此独立工作,但我还需要脚本 2 才能在需要时使用脚本 1 中的功能。我试图尽可能地自动化,所以每个脚本都有一些内部已经定义的变量。
这是我正在谈论的纸条的一个过于简单的例子。
脚本 1:
def plustwo(n):
out = n + 2
print(out)
m=3
plustwo(m)
Result:
5
脚本 2:
from file import plustwo
z=5
plustwo(z)
Result:
5
7
如您所见,当我从脚本 1 导入函数时,即使我使用 from file import plustwo
,也会导入变量,这导致脚本 2 到 return 两个结果,一个是变量 m
(5) 和另一个变量 z
(7).
我是否一定需要创建第三个脚本,与脚本 2 相同但没有 m
变量?有没有办法从导入中排除这样的变量? (我只想要脚本 2 中的函数,这样我就可以使用脚本 1 和它已有的变量。)
在脚本1中,可以添加if __name__ == '__main__':
,使其只执行
m=3
plustwo(m)
如果程序是 运行 直接来自 script1.py
。
最后只需要稍微修改一下脚本1即可:
def plustwo(n):
out = n + 2
print(out)
if __name__ == '__main__':
m=3
plustwo(m)
不,不是。
import
语句总是会在第一次 运行 时 执行 整个目标模块。即使将 import
写入 cherry pick 仅从目标文件中挑选几个函数和名称,文件仍会从第一行执行到最后一行 - 这就是语言的工作方式。
在此执行中创建的“模块对象”(基本上是一个包含所有函数的命名空间,classes 和模块中全局定义的变量),它们是否在 sys.modules
字典中可用.在引用同一文件的第二个 import 语句中,它将再次 not 运行:缓存版本用于从中选择任何函数或变量。
当模块文件本身直接 side-effects 并且仍然希望它的某些部分应该是可导入的时,做法是将您不想在导入时执行的代码放入如果自动变量 __name__
包含字符串 "__main__"
,则只有 运行s 的块。 Python 这样做是为了让模块可以“知道”模块是 运行ning 作为主程序,还是已作为更大系统的一部分导入。
这个成语在 Python 项目中无处不在,通常看起来像:
...
if __name__ == "__main__":
# this block only runs when the coded is executed as the main program
m = 3
plustwo(m)
(由于显而易见的原因,这出现在文件末尾,函数定义之后)
否则,唯一可能的解决方法是将模块文件作为文本文件读取,动态解析和 re-generate 另一个源文件,只包含感兴趣的行,然后是进口。即便如此,以这种方式导入的函数或 classes 也不可能寻址任何其他函数,class 或同一模块中的变量,当然。
我有两个脚本 1 和 2,我需要这两个脚本彼此独立工作,但我还需要脚本 2 才能在需要时使用脚本 1 中的功能。我试图尽可能地自动化,所以每个脚本都有一些内部已经定义的变量。
这是我正在谈论的纸条的一个过于简单的例子。
脚本 1:
def plustwo(n):
out = n + 2
print(out)
m=3
plustwo(m)
Result:
5
脚本 2:
from file import plustwo
z=5
plustwo(z)
Result:
5
7
如您所见,当我从脚本 1 导入函数时,即使我使用 from file import plustwo
,也会导入变量,这导致脚本 2 到 return 两个结果,一个是变量 m
(5) 和另一个变量 z
(7).
我是否一定需要创建第三个脚本,与脚本 2 相同但没有 m
变量?有没有办法从导入中排除这样的变量? (我只想要脚本 2 中的函数,这样我就可以使用脚本 1 和它已有的变量。)
在脚本1中,可以添加if __name__ == '__main__':
,使其只执行
m=3
plustwo(m)
如果程序是 运行 直接来自 script1.py
。
最后只需要稍微修改一下脚本1即可:
def plustwo(n):
out = n + 2
print(out)
if __name__ == '__main__':
m=3
plustwo(m)
不,不是。
import
语句总是会在第一次 运行 时 执行 整个目标模块。即使将 import
写入 cherry pick 仅从目标文件中挑选几个函数和名称,文件仍会从第一行执行到最后一行 - 这就是语言的工作方式。
在此执行中创建的“模块对象”(基本上是一个包含所有函数的命名空间,classes 和模块中全局定义的变量),它们是否在 sys.modules
字典中可用.在引用同一文件的第二个 import 语句中,它将再次 not 运行:缓存版本用于从中选择任何函数或变量。
当模块文件本身直接 side-effects 并且仍然希望它的某些部分应该是可导入的时,做法是将您不想在导入时执行的代码放入如果自动变量 __name__
包含字符串 "__main__"
,则只有 运行s 的块。 Python 这样做是为了让模块可以“知道”模块是 运行ning 作为主程序,还是已作为更大系统的一部分导入。
这个成语在 Python 项目中无处不在,通常看起来像:
...
if __name__ == "__main__":
# this block only runs when the coded is executed as the main program
m = 3
plustwo(m)
(由于显而易见的原因,这出现在文件末尾,函数定义之后)
否则,唯一可能的解决方法是将模块文件作为文本文件读取,动态解析和 re-generate 另一个源文件,只包含感兴趣的行,然后是进口。即便如此,以这种方式导入的函数或 classes 也不可能寻址任何其他函数,class 或同一模块中的变量,当然。