0

我无法从使用setuptools本地编写和安装的软件包中导入模块。我似乎最终得到一个空的包,除非我明确地导入__init__.py中的模块,即使如此,它只会将包含cd'的东西导入到包的源目录中。安装了python软件包,内部源代码目录除外

这里是我封装结构

foo_project/ 
|-- setup.py 
|-- foo/ 
|-- |-- __init__.py 
|-- |-- moduleA.py 
|-- |-- moduleB.py 
|-- |-- ... 

我使用virtualenvwrapper,并要安装在某些环境ENV上面的包,并打算能够导入模块中的一些其他目录foo_examples

首先,我的__init__.py是空的。要安装,我:

  • 运行workon ENV激活虚拟环境
  • cdfoo_project
  • 运行python setup.py install

包似乎已成功安装;我甚至可以检查~/.virtualenvs/ENV/lib/python3.4/site-packages中的蛋,它似乎有所有正确的文件。

但是,当我尝试导入模块,它显示为空:

>>> import foo 
>>> dir(foo) 
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__'] 
>>> foo.moduleA 
AttributeError: 'module' object has no attribute 'moduleA' 

但是,如果我明确地导入在__init__.py我的模块,它们成为可访问:

__init__.py

from . import moduleA, moduleB, ... 

然后:

from foo import moduleA 

不会抛出错误,但只有当我还在包源目录中。如果我升一级,我会遇到同样的问题。

$ cd .. 
$ python 
>>> import foo 
>>> dir(foo) 
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__'] 
>>> foo.moduleA 
AttributeError: 'module' object has no attribute 'moduleA' 

我试过寻找相关的问题,但没有运气。我怀疑这可能是一个小小的错误,或者我完全用错误的方式去做。我会很感激一些帮助。谢谢。

回答

0

我想我有一个想法!

因为你已经写了一个模块,你可以导入它。这很清楚。但python无法将模块中的脚本解释为属性。你正在做的是通过调用它像这样:

foo.moduleA 

此外moduleA 的.py不是一个属性,它是一个程序。 如果您在模块A .py中编写属性代码,则您的代码可以工作!

像这样可以在项目中获得一些代码作为属性代码!

我希望我能帮助你!

h_e_u_r_e_k_a

编辑:

这是moduleA.py代码(例如,这就是答案代码:)

 def myfunctioninA(): 
     print('Spam') 
     print('test') 

如果你导入像你的其他文件这样的:

 foo.myfunctioninA() 

它将打印Spamtest

该模块应该有一个不同于包的名称。

+1

恐怕你的回答不清楚。你可以通过“在moduleA.py中写入属性代码”给出一些具体的例子吗? –