setup.py 中的 package_dir 未按预期工作

G. *_*eer 5 python setuptools setup.py

我试图让用户在他们认为合适的任何文件夹名称下将代码编写为 python 模块(定义了 __init__.py 的文件夹)。之后我想将该模块安装为 python 包,但自己定义导入名称。

文件夹结构如下:

project_name/
    user_defined_name/
        __init__.py
        ...
    setup.py
Run Code Online (Sandbox Code Playgroud)

根据这个我应该能够加入到我的setup.py得到它的工作:

setuptools.setup(
    package_dir={'my_defined_name': 'user_defined_name'},
    packages=['user_defined_name']
)
Run Code Online (Sandbox Code Playgroud)

但我能够访问代码的唯一方法是使用import user_defined_name. 我尝试在没有 -e 的情况下安装软件包,但结果相同。离开packages=['..']设置功能也没有改变结果。

我的问题与这个问题类似,唯一的答案似乎是更改文件夹名称,这是我想避免的。该问题提到这可能是由于 setuptools 中的问题,但似乎在 3 年前就已解决。

RAC*_*OME 6

@Oliver 的回答在这里为我澄清了这一点。

我的 TLDR 是,要支持版本(python setup.py installpip install .)和可编辑安装(python setup.py developpip install -e .),必须将文件结构更改为

project_name
    setup.py 
    user_defined_name
        my_defined_name
            __init__.py
            ... 
    docs 
    tests
Run Code Online (Sandbox Code Playgroud)

和你setup.py

setuptools.setup(
    package_dir={'': 'user_defined_name'},
    packages=['my_defined_name']
)
Run Code Online (Sandbox Code Playgroud)

您可以仅支持版本(不可编辑安装

project_name
    setup.py 
    user_defined_name
        __init__.py
        ... 
    docs 
    tests
Run Code Online (Sandbox Code Playgroud)
setuptools.setup(
    package_dir={'my_defined_name': 'user_defined_name'},
    packages=['my_defined_name']
)
Run Code Online (Sandbox Code Playgroud)


sin*_*roc 5

简而言之,看起来您需要类似的东西setup.py

setuptools.setup(
    package_dir={
        'my_defined_name': 'user_defined_name',
    },
    packages=[
        'my_defined_name',
    ],
)
Run Code Online (Sandbox Code Playgroud)

正如伊利亚·诺沃肖洛夫(Ilia Novoselov)在对你的问题的评论中所说的那样。

如果您正常打包并安装项目,这应该可以工作。你一定可以的import my_defined_name

不过,请注意,据我所知,如果您使用可编辑安装python setup.py developpython -m pip install --editable .),这将不起作用。这是不可能的import my_defined_name,但你能够做到import user_defined_name,这不是你想要的。