首页 > 解决方案 > 使用不同目录中的源构建 Python 包

问题描述

在构建源代码树如下所示的 python 包时:

src -\
     +- module -\
           <stuff>
     +- setup.py

很清楚。

是否可以构建一个模块源不与 setup.py 位于同一位置的包?对于更具体的用例,模块的代码部分或完全在其他位置自动生成src

例如

src -\
     +- setup.py
generated -\
           module -\
                   <module code>

标签: pythonpython-3.xsetuptools

解决方案


package_dir您可以通过使用参数来控制包所在的目录setup(...)

虽然它似乎确实构建了一个适当的源代码分发时package_dir是一个以 开头的相对路径..,但它似乎pip会拒绝安装它——我建议改为将生成的代码嵌套在该src目录中,然后使用package_dir它来选择它。

这是一个将所有模块移动到子目录中的示例generated

setup(
    name='mypkg',
    package_dir={'': 'generated'},
    packages=find_packages('generated'),
)

使用如下设置:

$ tree .
.
├── generated
│   ├── mod1
│   │   └── __init__.py
│   └── mod2
│       └── __init__.py
└── setup.py

这将使以下安装成功:import mod1; import mod2

如果你想让这些模块在不同的前缀下可用,你会这样做:

setup(
    name='mypkg',
    package_dir={'hello': 'generated'},
    packages=[f'hello.{mod}' for mod in find_packages('generated')],
)

这将import hello.mod1; import hello.mod2在安装后成功


推荐阅读