在可编辑模式下安装具有单独源目录的包

时间:2017-07-17 08:42:33

标签: python pip packages setuptools distutils

情况

这是示例包的结构:

$ 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}在任何情况下都应该起作用)。

1 个答案:

答案 0 :(得分:0)

我相信在src文件夹中应该有一个包含 init .py和bar.py的foo文件夹,这样包名称就是foo,你可以导入foo包。不知道为什么它在可编辑模式下的表现不同。