2017-07-17 37 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软件包。不知道为什么它在可编辑模式下表现不同。