首页 > 解决方案 > Python setuptools:打包根目录(每个包不需要子目录)

问题描述

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

import mypkg.module1

带目录结构

root_folder/
    - setup.py
    - __init__.py  # the init for package "mypkg" (empty)
    - module1.py

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

root_folder/
    - setup.py
    - mypkg/  # WHY would I do that for 1 module??
        - __init__.py
        - module1.py
# Content of setup.py
from setuptools import setup

setup(name='MyPkg',
      packages=['mypkg']
      package_dir={'mypkg': '.'})

但结果,import mypkg失败并import module1有效,而不是期望的import mypkg.module1.

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

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

# Content of setup.py with a namespace package
from setuptools import setup

setup(name='MyPkg',
      packages=['thisdir']
      package_dir={'thisdir': '.'},
      namespace_packages=['mypkg'])

标签: pythonsetuptoolspython-packaging

解决方案


如果没有测试,我认为也许这样的东西可以工作:

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

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

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


但结果,import mypkg失败并import module1有效,而不是期望的import mypkg.module1

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

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

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


相关


推荐阅读