导入本地包时出现问题

时间:2014-02-11 17:37:14

标签: python packages

我将重新组织我的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,但它没有帮助。

1 个答案:

答案 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