从不同子文件夹的子文件夹中相对导入python模块

Dex*_*ter 8 python import python-module alembic

我正在尝试使用alembic,它是python中的sqlalchemy工具.您键入一个命令,它会生成一个文件夹"alembic",里面有py文件.里面的py文件,需要在一个名为"myapp"的单独文件夹中链接到我的应用程序.但我不能把它联系起来.它说它不存在,相对导入不起作用.

所以我需要从myapp/configs/config.py文件导入我的配置类.

/apps
+--/alembic
|----env.py <--- the calling file
+--/myapp
|----configs/__init__.py <--- has "DefaultConfig" class imported
|----configs/config.py <--- I want to import the class inside here.
Run Code Online (Sandbox Code Playgroud)

在env.py里面:

from myapp.configs import DefaultConfig
Run Code Online (Sandbox Code Playgroud)

不行.

我试过了:

from ..myapp.configs import DefaultConfig
Run Code Online (Sandbox Code Playgroud)

没有成功.

alembic docs中的示例代码说只使用"myapp.whatever".

我甚至在环境变量中将我的"/ apps"和"/ myapp"添加到PYTHON_PATH.

示例错误:

File "D:\apps\myapp\lib\site-packages\alembic\command.p
y", line 97, in revision
    script.run_env()
  File "D:\apps\myapp\lib\site-packages\alembic\script.py
", line 191, in run_env
    util.load_python_file(self.dir, 'env.py')
  File "D:\apps\myapp\lib\site-packages\alembic\util.py",
 line 186, in load_python_file
    module = imp.load_source(module_id, path, open(path, 'rb'))
  File "alembic\env.py", line 5, in <module>
    from ..myapp.configs import DefaultConfig as conf
ValueError: Attempted relative import in non-package
Run Code Online (Sandbox Code Playgroud)

Kul*_*lbi 9

您有两种可能的问题解决方案:

修改PYTHONPATH环境变量

通过在终端中运行以下BASH/SH shell命令,将路径添加到应用程序目录:

$ export PYTHONPATH=$PYTHONPATH:'/path/to/apps'
Run Code Online (Sandbox Code Playgroud)

请注意,将其添加到PATH环境变量将不起作用.要了解有关PYTHONPATH的更多信息,如何管理它以及一般模块的友好信息:

http://www.stereoplex.com/blog/understanding-imports-and-pythonpath

但请注意,这种方法确实会影响系统的PYTHONPATH.强烈建议使用virtualenv - 以防出现问题,它不会影响您的所有系统和其他应用程序.使用virtualenvwrapper时:

$ add2virtualenv '/path/to/apps'
Run Code Online (Sandbox Code Playgroud)

更多HERE.

从Python脚本内部追加路径

或者,您可以通过添加以下内容执行相同的操作,但仅针对脚本运行时:

import sys
sys.path.append('/path/to/apps')
Run Code Online (Sandbox Code Playgroud)

到你的apps/alembic/env.py文件.

最后,在同一个文件中,进行以下更改:

from myapp.configs.config import DefaultConfig
Run Code Online (Sandbox Code Playgroud)

请注意,你的apps/myapp文件夹也应该包含__init__.py文件(可能是空的),以使Python可以作为一个模块,如Demian Brecht指出的那样.