大概目录树如下:
.
├── entry1.py
├── other_files.py
└── sub
├── entry2.py
└── pkg
├── __init__.py
├── mdl_1.py
└── mdl_2.py
sub 是从一个子项目拷贝过来的( git submodule ),主项目要把它整合起来。
而在 entry2.py 中有引用
from pkg.mdl_1 import some_class
会提示 unresoleved reference ,原因很明显,有两种方法可以解决
1 、改成相对引用
from .pkg.mdl_1 import some_class
2 、改成完整引用
from sub.pkg.mdl_1 import some_class
但是问题就来了,由于 sub 是子项目,在某些时候要求 sub 可以独立运行( entry2.py ),而在这时以上两种方法均不能使 sub 正确 import 。
在 so 查到相关问题: http://stackoverflow.com/questions/16981921/relative-imports-in-python-3
有点区别。历史原因居然是 Guido 的一己之见而搞得这么复杂……
[所以现在需要一个能够同时兼容主项目和子项目独立运行的简单的 import 方式。]
1
linnchord 2016-09-02 15:57:15 +08:00 via Smartisan T1
不要作为 sub momodule ,作为外部模块引用,系统初始化时增加模块路径到系统路径。
|
2
binux 2016-09-02 16:24:15 +08:00
|
3
lxy OP |
4
binux 2016-09-02 17:01:03 +08:00
@lxy 你的 sub 并不是一个正确组织的模块,如果它是正确组织的模块,作为一个整体,单独直接运行一个模块内的任何脚本都是错误的用法。
|
5
lxy OP @binux 原本 sub 就可以独立运行并完成任务,并且单独运行的时候, sub 并不从属于主项目(有的机器只需要部署 sub 即可),如果为了去组织一个“正确的模块”而去写一个 sub2 、牺牲代码一致性,实在不值得。
|
7
linnchord 2016-09-02 18:42:36 +08:00 via Smartisan T1
部署靠 fabric 无痛一键部署 不要手动啊
@binux 和我是一个意思,只是你是单独部署自定义目录,还是作为标准模块 setup 到系统标准目录。我们以前的实践是把标准、三方模块和自有模块分离的。 |
8
mgna17 2016-09-02 19:10:08 +08:00 via Android
如果是 ImportError 的话,为何不 try 一下呢 😏
|
9
kkzxak47 2016-09-03 09:21:06 +08:00 via Android
按照__name__执行不同的 import ?
一个一个 try ? |