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 年前就已解决。
我的 TLDR 是,要支持版本(python setup.py install和pip install .)和可编辑安装(python setup.py develop和pip 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)
简而言之,看起来您需要类似的东西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 develop或python -m pip install --editable .),这将不起作用。这是不可能的import my_defined_name,但你能够做到import user_defined_name,这不是你想要的。