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 包。但不确定为什么它在可编辑模式下的行为有所不同。