现状
安装包这是一个例子封装件的结构:在编辑模式单独的源目录
$ 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
一切都很好,我可以用这个包,如同我期望:当我安装在编辑模式(pip install -e Foo
)封装
>>> import foo
1
但是它不工作:
>>> 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
包(未找到)。
问题
我怎么可以准备使用单独的源文件夹(其名称是从包名称不同),这样我可以在编辑模式下安装,并仍然使用它,因为它是正常安装(包例如import <package-name>
应该在任何情况下工作)。
出于好奇,为什么名为'src'的软件包目录在第一位呢? – Grimmy
@Grimmy无可否认,我通常会遵循约定来命名包装后的源根目录(在本例中是'foo'),它在技术上解决了上述问题。然而,我发现'distutils' /'setuptools'支持源目录的自定义名称,所以我想知道它如何在可编辑模式下安装时一起播放。因此,这个问题更多的是“好奇的相关性”。 –