这是示例包的结构:
$ tree Foo/
Foo/
├── setup.py
└── src
├── bar.py
└── __init__.py
包的名称应为foo
,但包的源文件放在src
文件夹中。
文件的内容是:
setup.py:
from setuptools import setup
setup(
name='foo',
version='1',
packages=['foo'],
package_dir={'foo': 'src'}
)
__ INIT __ PY:
from .bar import bar
print(bar)
bar.py:
bar = 1
在做pip install Foo
时,一切都很好,我可以像我期望的那样使用这个包:
>>> import foo
1
但是,当我以可编辑模式(pip install -e Foo
)安装软件包时,它不起作用:
>>> import foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named 'foo'
相反,我现在可以导入src
:
>>> import src
1
使用-e
开关进行安装,创建了一个site-packages/foo.egg-link
文件,其中包含以下内容:
<path-to>/Foo
.
在foo.egg-info
中创建了相应的Foo
目录:
$ tree Foo/foo.egg-info/
Foo/foo.egg-info/
├── dependency_links.txt
├── PKG-INFO
├── SOURCES.txt
└── top_level.txt
SOURCES.txt
文件包含:
$ cat Foo/foo.egg-info/PKG-INFO
foo.egg-info/PKG-INFO
foo.egg-info/SOURCES.txt
foo.egg-info/dependency_links.txt
foo.egg-info/top_level.txt
src/__init__.py
src/bar.py
和top_level.txt
:
$ cat Foo/foo.egg-info/top_level.txt
foo
因此,在导入过程中,Python似乎忽略了Foo/foo.egg-info/
中显示的信息,而只是扫描Foo/
以获取名为foo
的包(找不到)。
如何准备一个使用单独的源文件夹(其名称与包名称不同)的包,以便我可以在可编辑模式下安装它并仍然使用它,因为它是正常安装的(即{{1}在任何情况下都应该起作用)。
答案 0 :(得分:0)
我相信在src文件夹中应该有一个包含 init .py和bar.py的foo文件夹,这样包名称就是foo,你可以导入foo包。不知道为什么它在可编辑模式下的表现不同。