我将重新组织我的python代码的大块作为一个包。我想这个包将保存在主代码所在的同一目录中。所以整个结构如下:
project directory
\-mymod
\-__init__.py # totaly empty
\-xsum.py # with xsum function
\-main.py # main program
因为它只是一个例子
#xsum.py
def xsum(a,b):
"just xsum"
return a+b
在main.py中:
#main.py
import mymod
print mymod.xsum.xsum(2,3)
Python返回错误:
Traceback (most recent call last):
File "main.py", line 3, in <module>
print mymod.xsum.xsum(2,3)
AttributeError: 'module' object has no attribute 'xsum'
我尝试将项目目录和/或项目目录/ mymod添加到sys.path,但它没有帮助。
答案 0 :(得分:2)
谢谢@doukremt(见上面的讨论)我找到了非常简单的解决方案:
在__init__.py
中插入代码
import sys,os
for filename in os.listdir(os.path.dirname(__file__)):
if filename[-3:] != ".py" or filename == "__init__.py" : continue
exec "from "+filename[:-3]+" import *"
它允许从包名称空间中的当前包中的所有py文件中导入所有名称。因此使用非常简单:
import mymod
mymod.xsum(2,3)
如果您希望在不同的命名空间中使用单独的模块名称,请使用__init__.py
中的下一个代码:
import sys,os
for filename in os.listdir(os.path.dirname(__file__)):
if filename[-3:] != ".py" or filename == "__init__.py" : continue
exec "import "+filename[:-3]
在这种情况下,您应指定子模块:
import mymod
mymod.xsum.xsum(2,3)
最后,如果您只想在目录中导入几个文件,请创建一个列表并导入它们:
import sys,os
__all__=["a","b","c","xsum"]
for filename in __all__:
exec "import "+filename