Python setuptools:打包根目录(每个包不需要子目录)

Pla*_*ong 6 python setuptools python-packaging

我需要将一个包写入存储库,但它是一个小型快速包,因此我认为不需要将文件放入子目录中。我只是想要:

import mypkg.module1
Run Code Online (Sandbox Code Playgroud)

具有目录结构

root_folder/
    - setup.py
    - __init__.py  # the init for package "mypkg" (empty)
    - module1.py
Run Code Online (Sandbox Code Playgroud)

我不想被限制增加文件夹层次结构,如下所示:

root_folder/
    - setup.py
    - __init__.py  # the init for package "mypkg" (empty)
    - module1.py
Run Code Online (Sandbox Code Playgroud)
root_folder/
    - setup.py
    - mypkg/  # WHY would I do that for 1 module??
        - __init__.py
        - module1.py
Run Code Online (Sandbox Code Playgroud)

但结果是,import mypkg失败了,并且import module1工作了,而不是期望的import mypkg.module1

我发现了这个问题,但“只需将 setup.py 向上移动一个文件夹”的答案不适合我。

在此处找到设置参数文档后,我尝试定义一个命名空间包:

# Content of setup.py
from setuptools import setup

setup(name='MyPkg',
      packages=['mypkg']
      package_dir={'mypkg': '.'})
Run Code Online (Sandbox Code Playgroud)

sin*_*roc 2

如果没有测试,我想也许类似的东西可以工作:

#!/usr/bin/env python3
import setuptools
setuptools.setup(
    name='MyPkg',
    version='0.0.0.dev0',
    packages=['mypkg'],
    package_dir={
        'mypkg': '.',
    },
)
Run Code Online (Sandbox Code Playgroud)

最大的问题是,据我记得,您最终也会setup.py在包中mypkg,因此import mypkg.setup确实会导入setup模块。我没有验证过。

另一个大问题是,与大多数修改一样package_dir,“开发/可编辑”安装很可能根本不起作用。


但结果是,import mypkg失败了,并且import module1工作了,而不是期望的import mypkg.module1

我可以想象如果项目没有实际安装,并且当前工作目录是项目的根目录,就会发生这种情况。

为了import mypkg成功,您必须确保项目已正确安装 ( python -m pip install .)。

如果import module1失败,您可能需要更改到不同的目录。


有关的