Python 在可编辑模式下使用单独的源目录安装软件包 处境

Python 在可编辑模式下使用单独的源目录安装软件包 处境,python,pip,packages,setuptools,distutils,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': 's

这是示例包的结构:

$ 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'}
)
from .bar import bar

print(bar)
bar = 1
\uuuu init\uuuuu.py:

from setuptools import setup

setup(
    name='foo',
    version='1',
    packages=['foo'],
    package_dir={'foo': 'src'}
)
from .bar import bar

print(bar)
bar = 1
bar.py:

from setuptools import setup

setup(
    name='foo',
    version='1',
    packages=['foo'],
    package_dir={'foo': 'src'}
)
from .bar import bar

print(bar)
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'
使用
-e
开关安装创建了一个
站点包/foo.egg链接
文件,其中包含以下内容:

<path-to>/Foo
.
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
在任何情况下都应该工作).

我认为在src文件夹中应该有一个foo文件夹,其中包含init.py和bar.py,这样包名将是foo,您可以导入foo包。不知道为什么它在可编辑模式下会有不同的行为。

出于好奇,为什么包目录首先命名为
src
?@Grimmy承认我通常会按照惯例在包之后命名源根目录(在本例中为
foo
)从技术上解决了上述问题。然而,我发现
distutils
/
setuptools
支持源目录的自定义名称,因此我想知道这与在可编辑模式下安装的效果如何。因此,这个问题更具有“奇怪的相关性”。