2017-07-17 43 views
2

現狀

安裝包這是一個例子封裝件的結構:在編輯模式單獨的源目錄

$ 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>應該在任何情況下工作)。

+0

出於好奇,爲什麼名爲'src'的軟件包目錄在第一位呢? – Grimmy

+0

@Grimmy無可否認,我通常會遵循約定來命名包裝後的源根目錄(在本例中是'foo'),它在技術上解決了上述問題。然而,我發現'distutils' /'setuptools'支持源目錄的自定義名稱,所以我想知道它如何在可編輯模式下安裝時一起播放。因此,這個問題更多的是「好奇的相關性」。 –

回答

0

我相信在src文件夾中應該有一個foo文件夾,其中包含init .py和bar.py這樣軟件包名稱將是foo,並且您可以導入foo軟件包。不知道爲什麼它在可編輯模式下表現不同。