我有一个Python应用程序,它具有以下目录结构:
/home/vagrant/app
/home/vagrant/app/support
/home/vagrant/app/utils (1)
/home/vagrant/app/examples/example_a
/home/vagrant/app/examples/utils (2)
我已将/ home / vagrant / app添加到我的PYTHONPATH中,所有文件夹都有__init__.py
个文件。
我尝试通过调用/home/vagrant/app$ python ./example/example_a/ex_a.py
它以追溯退出:
File "./examples/example_a/ex_a.py", line 14, in <module> (3)
from support.sp1.py import *
File "/home/vagrant/app/support/sp1.py", line 11, in <module> (4)
from utils.mod_a import *
ImportError: No module named mod_a
名为mod_a.py的模块位于~/app/utils
但不是~/app/examples/utils
。
我尝试将~/app/examples/utils
重命名为~/app/examples/utils-ex
。这解决了这个问题,但其他依赖'/ home / vagrant / app / examples / utils'的东西都被打破了。
有没有办法让python解释器查找utils(1)而不是utils(2)?文件(3)具有相对路径(以点为前缀),文件(4)具有绝对路径(以/为前缀)。我的想法是我的设置出了问题,这使得解释器在app /之前看到app / examples文件夹。我的启动路径位于app / examples / example_a路径中,但sp1.py不是。
当然,没有utils和examples / utils是最简单的,但这不是我的代码,我不好意思重写它。
答案 0 :(得分:1)
您需要先启用absolute imports。
from __future__ import absolute_import
from utils.mod_a import foo, bar
答案 1 :(得分:0)
我放弃并接受了不可避免的基于Bash的解决方案:
cp -r ./examples/utils/ ./examples/xutils/
rm -R ./examples/utils/utils
find ./ -type f -exec sed -i 's/examples.utils/examples.xutils/g' {} \;