【问题标题】:Python relative imports using setuptools with scripts使用带有脚本的 setuptools 的 Python 相对导入
【发布时间】:2017-01-20 04:34:47
【问题描述】:

我正在为我一直从事的项目过渡到基于包的工作流程。我希望能够分离开发和生产环境,我认为 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: Parent module '' not loaded, cannot perform relative import

我尝试了package_dir = ... 的各种排列方式,尤其是package_dir = {'': 'modulename'},但这会在安装时引发另一个错误error: package directory 'modulename/modulename' does not exist

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

【问题讨论】:

  • 我猜问题不是setup.py,而是script.py 作为__main__ 模块运行并同时使用相对导入。看看here
  • 好的,那么这里是为了将脚本保留在包之外,然后只使用普通导入吗?
  • 基本上就是这样,我想。
  • 你想发布一个实际的答案,我会接受,因为这在功能上解决了我的问题?

标签: python python-3.x import package


【解决方案1】:

该问题与setuptools 无关。在以__main__ 执行的模块内使用相对导入不能开箱即用。有一些变通方法/黑客,但最常见的解决方案似乎是将脚本移出包或在脚本文件中使用绝对导入。

请查看Relative imports in Python 3 了解完整内容。

【讨论】:

    猜你喜欢
    • 2013-12-15
    • 1970-01-01
    • 2016-08-18
    • 2016-07-19
    • 2021-07-13
    • 2011-01-13
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    相关资源
    最近更新 更多