gpt4 book ai didi

python - 为什么导入在 setuptools entry_point 脚本中失败,但在 python 解释器中却没有?

转载 作者:太空狗 更新时间:2023-10-30 00:39:26 26 4
gpt4 key购买 nike

我有以下项目结构:

project
|-project.py
|-__init__.py
|-setup.py
|-lib
|-__init__.py
|-project
|-__init__.py
|-tools.py

project.py :

from project.lib import *

def main():
print("main")
tool()

if __name__ == "__main__":
main()

setup.py :

from setuptools import setup

setup(
name = "project",
version="1.0",
packages = ["project", "project.lib"],
package_dir = {"project": ".", "project.lib": 'lib/project'},
entry_points={
'console_scripts': [
'project = project.project:main',
],
},
)

tools.py :

def tool():
print("tool")

如果我跑

import project.lib.tools
project.lib.tools.tool()

它按预期工作,但运行命令 project失败

Traceback (most recent call last):
File "/usr/local/bin/project", line 9, in <module>
load_entry_point('project==1.0', 'console_scripts', 'project')()
File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 568, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2720, in load_entry_point
return ep.load()
File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2380, in load
return self.resolve()
File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2386, in resolve
module = __import__(self.module_name, fromlist=['__name__'], level=0)
File "build/bdist.linux-x86_64/egg/project/project.py", line 3, in <module>
ImportError: No module named lib

我不明白为什么这两个解释器没有相同的默认导入路径。

此设置的原因是我希望能够 import project.lib.tools , 但保持目录结构为 lib/project .

完整 distutils文档严重地没有说明如何在分发包后导入包(setuptoolsdistutils 的区别并不那么神秘 - 无法知道 distutils 的行为是否在此处扩展或不)。

我正在使用 setuptools 18.4-1 与 python 2.7 在 Ubuntu 15.10 上。

如果我改变项目结构和setup.py正如@AnttiHaapala 的回答中所建议的,我得到了

$ project
Traceback (most recent call last):
File "/usr/local/bin/project", line 9, in <module>
load_entry_point('project==1.0', 'console_scripts', 'project')()
File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 568, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2720, in load_entry_point
return ep.load()
File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2380, in load
return self.resolve()
File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2386, in resolve
module = __import__(self.module_name, fromlist=['__name__'], level=0)
File "build/bdist.linux-x86_64/egg/project/project.py", line 3, in <module>
ImportError: No module named lib

最佳答案

您的项目结构似乎是 b0rken。发行版的标准布局是 setup.py 位于顶层。然后,您的项目将有 1 个(顶级)包,即 project,以及子包 project.lib。因此我们得到以下目录布局:

Project-0.42/
+- project/
| +- __init__.py
| +- lib/
| | +- __init__.py
| | +- tools.py
| +- project.py
+- setup.py

然后在你的 setup.py 中你可以简单地做

from setuptools import find_packages

setup(
...
# remove package_dir, it is unnecessary
packages=find_packages(),
...
)

package_dir 确实不能很好地同时处理顶级包和子包。在 pip remove project 多次之后,您可以确定站点包中没有安装任何有问题的版本,然后运行 ​​python setup.py develop 将源链接到 site-packages


在那之后,问题是您使用的是 Python 2 及其损坏的导入系统,该系统假定相对导入。在 project.py 中,您的 import project.lib 默认采用relative 导入,它会尝试实际导入 project.project .lib。因为这不是你想要的,你应该添加

from __future__ import absolute_import

在该文件的顶部。我强烈建议你添加这个(如果你在任何地方都使用 / 运算符,为什么不也添加 division 导入),以避免这些陷阱并保持 Python 3兼容。

关于python - 为什么导入在 setuptools entry_point 脚本中失败,但在 python 解释器中却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34803310/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com