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/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/.xml 之前查看 app/examples 文件夹。我的启动路径在 app/examples/example_a 路径中,但 sp1.py 不在。

当然,没有 utils 和 examples/utils 是最简单的,但这不是我的代码,我不愿意重写它。

4

2 回答 2

1

您需要先启用绝对导入

from __future__ import absolute_import
from utils.mod_a import foo, bar
于 2013-05-30T11:35:34.417 回答
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'  {} \;
于 2013-05-30T12:44:05.633 回答