8

我正在尝试使用 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.

在 env.py 中:

from myapp.configs import DefaultConfig

不工作。

我试过:

from ..myapp.configs import DefaultConfig

没有成功。

alembic 文档中的示例代码说只使用“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
4

2 回答 2

9

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

修改您的 PYTHONPATH 环境变量

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

$ export PYTHONPATH=$PYTHONPATH:'/path/to/apps'

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

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

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

$ add2virtualenv '/path/to/apps'

更多在这里

从 Python 脚本中附加路径

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

import sys
sys.path.append('/path/to/apps')

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

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

from myapp.configs.config import DefaultConfig

请注意,您的apps/myapp文件夹还应包含__init__.py文件(可能为空),以使 Python 将其视为 Demian Brecht 指出的模块。

于 2013-05-13T16:27:15.697 回答
0

myapp一个独立的应用程序,还是一个子应用程序,例如您可以使用 Django 找到的应用程序?如果它是一个独立的应用程序,那么你有点做错了。您真正想要做的是安装您的应用程序具有的依赖项,以便能够访问它们而不必使用相对导入等(这是不好的做法,特别是如果除了您之外的任何人都在使用该应用程序)。

您可能想要做的事情(同样,如果它是独立的):

  • 为您的应用程序设置一个虚拟环境(我强烈建议使用 virtualenvwrapper,我刚刚在我闪亮的新(和不完整)博客中写过它:http: //demianbrecht.github.com/posts/2013/01/02/虚拟环境包装器/
  • alembic作为依赖安装:pip install alembic
  • 创建一个requirements.txt文件:pip freeze > requirements.txt

现在,您应该可以import alembic在项目中的任何位置使用 alembic via。

编辑

您的目录结构也有点不稳定。您需要将所有特定于应用程序的模块放入另一个myapp子目录中:

myapp
    myapp
        __init__.py
        configs/__init__.py

这样做的原因是您可以添加myapp到您PYTHONPATH的应用程序并能够通过from myapp import foo. 就目前而言,如果myapp位于您的PYTHONPATH,您将只能从第二个命名空间级别(即import configs)访问子模块,这显然是不好的原因。

于 2013-02-04T08:01:39.323 回答