2013-05-30 62 views
0

我有一个具有以下目录结构的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 /流浪者/应用到我的PYTHONPATH和所有的文件夹都__init__.py文件。

我试图通过调用/home/vagrant/app$ python ./example/example_a/ex_a.py

它退出了回溯运行应用程序:命名mod_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 

模块存在于~/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

我放弃了,并接受基于猛砸不可避免的解决方案:

cp -r ./examples/utils/ ./examples/xutils/ 
rm -R ./examples/utils/utils 
find ./ -type f -exec sed -i 's/examples.utils/examples.xutils/g' {} \; 
1

您需要先启用absolute imports

from __future__ import absolute_import 
from utils.mod_a import foo, bar 
+0

我喜欢这个主意,但是,不幸的是没有工作 - 因为代码依赖于ex_a.py相对路径。我需要的是在ex_a.py中是相对的,在sp1.py中是绝对的。 – Terry