python路径导入碰撞

时间:2013-05-30 11:32:37

标签: python-2.7 python-import

我有一个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是最简单的,但这不是我的代码,我不好意思重写它。

2 个答案:

答案 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'  {} \;