Python 混乱的 import 问题

2016-09-02 15:51:54 +08:00
 lxy

大概目录树如下:

.
├── 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 方式。]

1706 次点击
所在节点    问与答
9 条回复
linnchord
2016-09-02 15:57:15 +08:00
不要作为 sub momodule ,作为外部模块引用,系统初始化时增加模块路径到系统路径。
binux
2016-09-02 16:24:15 +08:00
用法有误

1. 如果作为独立的模块, submodule 最好有 setup.py 允许独立 install 。你这样项目的组织结构是错误的。
2. entry2.py 作为 sub 内模块,不应该允许独立运行。
3. 如果你非得运行,一可以通过 setup.py 中指定 entry_points ,二可以通过 python -m sub.entry2 运行。
lxy
2016-09-02 16:51:22 +08:00
@linnchord 这个可以,就是部署麻烦。

@binux 12 、本来就是先有 sub 独立运行,后来才要整合的。 3 、 verbose

如果相对引用不需要 Parent module 就好了。若 Guido 不考虑改变一下 import 方式,我觉得这是一个败笔。
binux
2016-09-02 17:01:03 +08:00
@lxy 你的 sub 并不是一个正确组织的模块,如果它是正确组织的模块,作为一个整体,单独直接运行一个模块内的任何脚本都是错误的用法。
lxy
2016-09-02 17:24:26 +08:00
@binux 原本 sub 就可以独立运行并完成任务,并且单独运行的时候, sub 并不从属于主项目(有的机器只需要部署 sub 即可),如果为了去组织一个“正确的模块”而去写一个 sub2 、牺牲代码一致性,实在不值得。
binux
2016-09-02 17:35:19 +08:00
@lxy 架构一个正确的模块和能够独立运行又不冲突。。
linnchord
2016-09-02 18:42:36 +08:00
部署靠 fabric 无痛一键部署 不要手动啊

@binux 和我是一个意思,只是你是单独部署自定义目录,还是作为标准模块 setup 到系统标准目录。我们以前的实践是把标准、三方模块和自有模块分离的。
mgna17
2016-09-02 19:10:08 +08:00
如果是 ImportError 的话,为何不 try 一下呢 😏
kkzxak47
2016-09-03 09:21:06 +08:00
按照__name__执行不同的 import ?
一个一个 try ?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/303485

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX