使用带有脚本的 setuptools 的 Python 相对导入

标签 python python-3.x import package

我正在为我一直从事的项目过渡到基于包的工作流程。我希望能够将开发环境和生产环境分开,我认为 setuptools 在一定程度上提供了这种可能性。

我有一个结构如下的项目:

modulename/
    setup.py
    modulename/
         file_a.py
         script.py

在 script.py 中,我想导入 file_a.py。目前我通过 import file_a 来做到这一点。

我的 setup.py 看起来像:

from setuptools import setup, find_packages

setup(name='modulename',
  packages = find_packages(),
  package_dir = {'': '../modulename'},
  scripts = ['modulename/script.py'])

目前,当我在完成 python setup.py install 后运行 script.py 时,我收到一条错误消息:

SystemError: 父模块 '' 未加载,无法执行相对导入

我已经尝试了 package_dir = ... 的各种排列,最著名的是 package_dir = {'': 'modulename'},但这会引发另一个错误安装,错误:包目录 'modulename/modulename' 不存在

我不确定我做错了什么。 setuptools 的在线文档在处理涉及相对导入的情况时相对较差。有人可以指出我正确的方向吗?

最佳答案

此问题与 setuptools 无关。在作为 __main__ 执行的模块中使用相对导入不是开箱即用的。有变通办法/技巧,但最常见的解决方案似乎是将脚本移出包或在脚本文件中使用绝对导入。

看看Relative imports in Python 3完整的故事。

关于使用带有脚本的 setuptools 的 Python 相对导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39455388/

相关文章:

python - Kivy:是否有 "BoundedString"属性可用于 TextInputs?

mysql - python3模块在哪里

database - 在 Clickhouse 数据导入中,是否有忽略/替换目标列类型不正确的数据的设置?

python - 将 0 插入二维数组

python - 登录django项目的最佳实践

python-3.x - "Quota exceeded for quota group ' ReadGroup ' and limit ' 每个用户每 100 秒服务 google api 的读取请求

python-3.x - 将 PIL/Pillow 图像转换为数据 URL

mysql - 将数据从文本文件插入数据库表

css - 将 .css 文件导入 .less 文件

python - 是否可以将 Flask 中的 "app factory"模式用于 Click CLI 应用程序?