python:导入目录结构的问题,使脚本和模块保持独立

时间:2018-05-18 15:04:36

标签: python python-2.7 import

我有以下目录结构:

app/
  bin/
    script1.py
    script2.py
  lib/
    module1/
      __init__.py
      module1a.py
      module1b.py
    __init__.py
    module2.py
  Dockerfile

我的问题是我想执行 script1.pyscript2.py,但在这些脚本中,我想导入lib/中的模块。

我只需执行app/即可从根Dockerfile目录(即与python bin/script1.py相邻)运行我的脚本。当我使用from lib.module1 import module1a将模块导入我的脚本时,我得到ImportError: No module named lib.module1。当我尝试使用相对导入导入时,例如from ..lib.module1 import module1a,我得到ValueError: Attempted relative import in non-package

当我简单地启动解释器并运行import lib.module1或其他东西时,我没有任何问题。

我怎样才能让它发挥作用?

3 个答案:

答案 0 :(得分:1)

一般情况下,__init__.pyapp下需要bin,然后您可以进行相对导入,但需要包

如果您将python代码构造为python包(egg / wheel),那么您还可以定义一个入口点,它将成为安装后的/bin/文件。

这是一个包的示例 - https://python-packaging.readthedocs.io/en/latest/minimal.html

此博客很好地解释了切入点 - https://chriswarrick.com/blog/2014/09/15/python-apps-the-right-way-entry_points-and-scripts/

如果是这样,那么你就可以在你的包上做python setup.py install,然后在PATH中提供这些入口点,作为其中的一部分,你将开始以一种方式构建你的代码不会产生导入问题。

答案 1 :(得分:0)

您可以在script1.py中添加到运行时的Python路径:

import sys
sys.path.insert(0, '/path/to/your/app/')
import lib.module1.module1a

答案 2 :(得分:-1)

你必须将当前目录添加到python路径。

在终端中使用导出 或者你的python脚本中的sys.path.insert都可以

相关问题