问个好基础的 import 路径问题

2020-06-18 14:25:46 +08:00
 imn1
目录结构
folder:
--common.py
--A
----__init__.py 0 字节空文件
----a.py
--B
----__init__.py 0 字节空文件
----b.py
就是 folder 为根目录,A 和 B 是 folder 的子目录

common.py 里面
from A import ...
...
解释一下,common 会被多个模块调用,算是前置,它部分内容从 A.a 获取并计算


b.py 里面
import sys
sys.path.append('..')
from common import ...
...
if __name__ == '__main__':
...


现在情况:
folder> py ./B/b.py
“找不到 commn 模块,b.py 第 n 行”
B> py ./b.py
“找不到 A 模块,common.py 第 n 行”

暂时用其他方案是解决了,但想知道:
1.b.py 能否直接运行?
2.这种情况,b.py 该怎么写 import ?
1900 次点击
所在节点    Python
5 条回复
xiaolinjia
2020-06-18 14:30:52 +08:00
b.py 里要写

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

相当于将 folder 加入到 Python 路径下。
Vegetable
2020-06-18 14:42:58 +08:00
这个做法不是一个很好的习惯,但是写代码难免会遇到。
1 楼的代码时正确的,不过我更喜欢用这种写法

from pathlib import Path
import sys
sys.path.append(Path(__file__).parent.parent.absolute().__str__())

from common import *

这样的代码非常的 dirty,排序引用时会破坏代码结构,看起来也很乱。

记住一个核心,把项目的根目录的绝对路径加入到 path 中就行了。
imn1
2020-06-18 14:53:18 +08:00
@Vegetable
@xiaolinjia
就是说导入绝对路径么?这么说我懂了,谢谢

我另外一些模块是用绝对路径导入的,只是那些模块是多个项目可用的
单个项目内也用绝对路径,这个是没转过弯来
JCZ2MkKb5S8ZX9pq
2020-06-18 23:10:18 +08:00
这个我一开始也绕过。

现在是项目相关的走根目录,比如 from config import *

自有通用工具都放一个目录,比如 util,加到 path 。
然后 from util.atool import atool
JCZ2MkKb5S8ZX9pq
2020-06-18 23:27:13 +08:00
另外模块化调用
folder> py ./B/b.py
变成
folder> python -m b.b

缺点是有时忘了会调用错误,但直接集成到 sublime 的 build 了,就问题不大。而且自那以后,项目结构有改好一点,一开始都平级目录一堆 py……

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

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

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

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

© 2021 V2EX