除了源目录之外,安装的python包为空

时间:2016-03-07 14:56:15

标签: python-3.x virtualenv setuptools python-module virtualenvwrapper

我在使用setuptools在本地编写和安装的软件包中导入模块时遇到问题。我似乎最终得到一个空包,除非我在我的__init__.py中明确导入模块,即使这样,它只会导入东西,如果我cd'进入包的源目录。

这是我的包结构

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

我正在使用virtualenvwrapper,并希望在某些环境ENV中安装上述软件包,并打算能够在其他目录foo_examples中导入该模块。

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

  • 运行workon ENV以激活虚拟环境
  • cd加入foo_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一级,我会遇到同样的问题。

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

我尝试寻找相关问题,但没有运气。我怀疑这是一个小错误,或者我完全以错误的方式解决这个问题。我会感激一些帮助。感谢。

1 个答案:

答案 0 :(得分:0)

我想我有个主意!

因为你已经编写了一个模块,你可以导入它。很清楚。但是python不能将模块中的脚本解释为属性。你是这样称呼的:

    foo.moduleA

此外,moduleA .py 不是属性,它是一个程序。 如果您在moduleA .py

中编写属性代码,那么您的代码可以正常工作

像这样可以将一些代码作为项目中的属性代码获取!

我希望我能帮到你!

h_e_u_r_e_k_a

编辑:

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

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

如果您在其他文件中导入它,请执行以下操作:

     foo.myfunctioninA()

它会打印Spamtest

模块的名称应与包不同。