Python,已安装脚本将命名空间误认为模块失败

2024-06-25 05:33:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我们已经实现了许多Python脚本(按原样) 正确和正确)在模块中。这些的setup.py包括

setup(
  :
  packages = ['sv.sd5ls'],
  namespace_packages = ['sv'],
  scripts = ['bin/sd5-ls'],
  :

它显式声明包的命名空间和模块。 特别是,我们不使用 setuptools(我们只有一个或两个模块,所以我们并不真正需要 它)

这一切都可以在开发机器(使用Python 3.6.9)上正常工作 和股票操作系统setuptools 39.0.1,也在CI上,后者有Python 3.6.10 和setuptools 40.8.0,同样是库存操作系统

一位同事在运行已安装的软件包时遇到问题(事实上,所有 (其中)

$ sd5-ls --help
Traceback (most recent call last):
  File "/usr/local/bin/sd5-ls", line 4, in <module>
  __import__('pkg_resources').run_script('svsd5-sd5ls==6.0a2', 'sd5-ls')
  File "/usr/local/lib/python3.6/dist-packages/pkg_resources/__init__.py",
    line 667, in run_script
  self.require(requires)[0].run_script(script_name, ns)
  File "/usr/local/lib/python3.6/dist-packages/pkg_resources/__init__.py",
    line 1471, in run_script
  exec(script_code, namespace, namespace)
  File "/usr/local/lib/python3.6/dist-packages/svsd5_sd5ls-6.0a2-py3.6.egg/EGG-INFO/scripts/sd5-ls",
    line 3, in <module>
__requires__ = 'svsd5-sd5ls==6.0a2'
ModuleNotFoundError: No module named 'sv'

检查dist-packages目录

drwxr-sr-x  5 root staff   4096 May 18 11:27 pkg_resources
drwxr-sr-x  6 root staff   4096 May 18 11:27 setuptools
drwxr-sr-x  2 root staff   4096 May 18 11:27 setuptools-46.4.0.dist-info
-rw-r--r--  1 root staff   5602 Jun 23 11:27 svsd5_sd5ls-6.0a2-py3.6.egg

请注意较新版本的setuptools和pkg_resources目录 在安装的同时创建。唯一提到的pkg_resources 在我们的代码中是sd5-ls/sv/__init__.py,它包含行

__import__('pkg_resources').declare_namespace(__name__)

正如Python名称空间文档中所建议的那样 包括对pkg_resources/__init__.py的调用。我猜这就是问题所在。 已安装的程序垫片(自动生成)仅为

#!/usr/bin/python3
# EASY-INSTALL-SCRIPT: 'svsd5-sd5ls==6.0a2','sd5-ls'
__requires__ = 'svsd5-sd5ls==6.0a2'
__import__('pkg_resources').run_script('svsd5-sd5ls==6.0a2', 'sd5-ls')

我认为目标{}是嵌入在{}中的虚拟目标 文件,但在错误中,我们在dist-packages目录中拾取了预先存在的一个 这是不相容的

这听起来对吗?在这种情况下,删除预先存在的pkg_resources会/应该解决问题,还是有更好的方法


Tags: runpya2packagesusrdistscriptpkg
1条回答
网友
1楼 · 发布于 2024-06-25 05:33:17

事实上,我在this repository中的注释中找到了一个解决方案

Zipped eggs don't play nicely with namespace packaging, and may be implicitly installed by commands like python setup.py install. To prevent this, it is recommended that you set zip_safe=False in setup.py, as we do here.

相关问题 更多 >