我试图让用户将代码作为python模块(定义了__init__.py的文件夹(写在他们认为合适的任何文件夹名称下。之后,我想将该模块作为python包安装,但我自己定义导入名称。
文件夹结构如下:
project_name/
user_defined_name/
__init__.py
...
setup.py
根据这一点,我应该能够将其添加到我的setup.py中以使其工作:
setuptools.setup(
package_dir={'my_defined_name': 'user_defined_name'},
packages=['user_defined_name']
)
但我能够访问代码的唯一方法是使用import user_defined_name
。我尝试在没有-e的情况下安装程序包,但结果相同。将packages=['..']
排除在设置函数之外也不会改变结果。
我的问题和这个问题差不多,唯一的答案似乎是更改文件夹名称,这是我想避免的。这个问题提到,这可能是由于setuptools中的一个问题,但这似乎在3年前就解决了。
简而言之,在setup.py
:中似乎需要这样的东西
setuptools.setup(
package_dir={
'my_defined_name': 'user_defined_name',
},
packages=[
'my_defined_name',
],
)
正如Ilia Novoselov在对您的问题的评论中所说。
如果您正常地打包和安装项目,这应该会起作用。您将能够import my_defined_name
。
不过,请注意,据我所知,如果使用可编辑安装(python setup.py develop
或python -m pip install --editable .
(,这将不起作用。import my_defined_name
是不可能的,但你可以import user_defined_name
,这不是你想要的。
@Oliver在这里的回答为我澄清了这一点。
我的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
和你的setup.py
到
setuptools.setup(
package_dir={'': 'user_defined_name'},
packages=['my_defined_name']
)
您可以使用支持仅发布(不可编辑安装(
project_name
setup.py
user_defined_name
__init__.py
...
docs
tests
setuptools.setup(
package_dir={'my_defined_name': 'user_defined_name'},
packages=['my_defined_name']
)