現狀
安裝包這是一個例子封裝件的結構:在編輯模式單獨的源目錄
$ 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'支持源目錄的自定義名稱,所以我想知道它如何在可編輯模式下安裝時一起播放。因此,這個問題更多的是「好奇的相關性」。 –