我正在尝试使用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.
from myapp.configs import DefaultConfig
不起作用。
我试过了:
from ..myapp.configs import DefaultConfig
没有成功。
在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
答案 0 :(得分:9)
您的问题有两种可能的解决方案:
通过在终端中运行以下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'
更多HERE。
或者,您可以通过添加:
来执行相同的操作,但仅适用于脚本运行时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指出的模块进行处理。
答案 1 :(得分:0)
myapp
是一个自包含的应用程序,还是一个子应用程序,例如你可以使用Django找到的应用程序?如果它是一个独立的应用程序,那么你有点不对劲。您真正想要做的是安装您的应用程序所具有的依赖项,以便能够访问它们而不必使用相对导入等(这是不好的做法,尤其是,除非您有任何人正在使用该应用程序。)
你可能会想要做什么(再次,如果它是独立的):
alembic
作为依赖项:pip install alembic
requirements.txt
文件:pip freeze > requirements.txt
现在,您应该可以在项目的任何位置通过import alembic
使用alembic。
修改强>:
您的目录结构也有点不稳定。您需要将所有特定于应用程序的模块放入另一个myapp
子目录:
myapp
myapp
__init__.py
configs/__init__.py
这样做的原因是您可以将myapp
添加到PYTHONPATH
,并且可以通过from myapp import foo
从您的应用中导入任何模块。如上所述,如果myapp
上有PYTHONPATH
,您将只能从第二个命名空间级别(即import configs
)访问子模块,这显然是不好的。