无法导入本地python模块

无法导入本地python模块,python,python-3.x,Python,Python 3.x,我有一个脚本,其中包含一个我想在另一个脚本中使用的函数,即 def main(): def ex(a,b): return a+b if __name__ == "__main__": main() 每当我将此脚本导入另一个脚本时,都会出现错误“模块“script”没有属性“ex”: 是的,这是正确的,函数ex()是一个局部函数,它只在函数main()的范围内已知。如果您导入该模块,它将包含函数main(),如果您在其中调用该函数,则在执行该函数时,将存在函数

我有一个脚本,其中包含一个我想在另一个脚本中使用的函数,即

def main():
    def ex(a,b):
        return a+b

if __name__ == "__main__":
    main()
每当我将此脚本导入另一个脚本时,都会出现错误“模块“script”没有属性“ex”:


是的,这是正确的,函数
ex()
是一个局部函数,它只在函数
main()
的范围内已知。如果您导入该模块,它将包含函数
main()
,如果您在其中调用该函数,则在执行该函数时,将存在函数
ex()
。一旦函数
main()
终止,函数
ex()
将停止存在

您可能觉得函数有一个(模块)全局作用域,而Python中没有

您可以通过多种方式更改代码以避免错误。最明显的是在模块级别定义
ex()
(即
main()
函数中的no):

另一种选择是返回本地函数:

def main():
    # do whatever
    pass

def ex(a,b):
    return a+b
def main():
    def ex(a,b):
        return a+b
    return ex
然后导入程序可以执行以下操作:

import script

ex = script.main()
print(ex(4, 5))

还有很多其他的方法来实现你想要的。既然你没有告诉我们为什么这个
ex()
在这个
main()
中,我们只能猜测哪种方式最适合你。

你必须将你的代码转换成这样的东西:

def main(a,b):
    def ex(a,b):
        return a+b
    return ex(a,b)
if __name__ == "__main__":
    main()
要详细说明这样的情况,可能会发生:

import script
script.main(1,2)

问题是ex()是在main函数的作用域下定义的。您将无法直接从外部访问它

要在试图调用函数时调用函数
ex()
,必须将其封装在script.py中的类中,或任何存在于中的文件
script
。因此,在您的情况下,script.py应该如下所示:

def main(a,b):
    def ex(a,b):
        return a+b
    return ex(a,b)
if __name__ == "__main__":
    main()
类脚本:
def ex(a、b):
返回a+b

在要使用脚本的文件中:

script=newscript()
script.ex(4,5)


希望这有帮助。

ex
未公开,不能像那样导入<但是,如果这有助于说明导出的内容,则代码>main是。换句话说,您必须将
def ex()
置于与
def main()
相同的范围/缩进级别。是的,这就是我的印象。我猜在module.main()被导入后调用它不是一个好的做法?好吧,这要看情况而定。我从未见过它被命名为
main()
,但有些模块在导入后需要进行初始化。最显著的图形库出现在脑海中,例如。g<代码>导入SomeWindowsLib,然后
winServer=SomeWindowsLib.init()
…getWinServer()
或类似。