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

a_g*_*est 5 python distutils packages pip setuptools

情况

这是示例包的结构:

$ tree Foo/
Foo/
??? setup.py
??? src
    ??? bar.py
    ??? __init__.py
Run Code Online (Sandbox Code Playgroud)

包的名称应该是foo包的源文件放在src文件夹中。

文件的内容是:

设置.py:

from setuptools import setup

setup(
    name='foo',
    version='1',
    packages=['foo'],
    package_dir={'foo': 'src'}
)
Run Code Online (Sandbox Code Playgroud)

__init__.py:

from .bar import bar

print(bar)
Run Code Online (Sandbox Code Playgroud)

酒吧.py:

bar = 1
Run Code Online (Sandbox Code Playgroud)

问题

pip install Foo一切都很好时,我可以按预期使用该软件包:

>>> import foo
1
Run Code Online (Sandbox Code Playgroud)

但是,当我以可编辑模式 ( pip install -e Foo)安装软件包时,它不起作用:

>>> import foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'foo'
Run Code Online (Sandbox Code Playgroud)

相反,我src现在可以导入:

>>> import src
1
Run Code Online (Sandbox Code Playgroud)

使用-e交换机安装会创建一个site-packages/foo.egg-link包含以下内容的文件:

<path-to>/Foo
.
Run Code Online (Sandbox Code Playgroud)

foo.egg-info已在以下位置创建了相应的目录Foo

$ tree Foo/foo.egg-info/
Foo/foo.egg-info/
??? dependency_links.txt
??? PKG-INFO
??? SOURCES.txt
??? top_level.txt
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

top_level.txt

$ cat Foo/foo.egg-info/top_level.txt 
foo
Run Code Online (Sandbox Code Playgroud)

因此,在导入过程中,Python 似乎忽略了其中显示的信息,Foo/foo.egg-info/而只是扫描Foo/名为foo(未找到)的包。

我如何准备一个使用单独的源文件夹(其名称与包名称不同)的包,以便我可以在可编辑模式下安装它并仍然像正常安装一样使用它(import <package-name>例如在任何情况下都应该工作) )。

小智 0

我相信在 src 文件夹中应该有一个 foo 文件夹,其中包含init .py 和 bar.py 这样包名称将为 foo 并且您可以导入 foo 包。但不确定为什么它在可编辑模式下的行为有所不同。