Python 包导入的困惑
source link: https://www.v2ex.com/t/813185
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
下载了一个 python 项目,目录是这样子的
- XXXProject
- A
- __init__.py
- xxx.py
- yyy.py
- ...
- scripts
- zzz.sh
xxx.py 的内容是
from A.yyy import YY
if __name__ == "__main__":
# .....
yyy.py 的内容是
class YYY():
# .....
zzz.sh 的内容是
python A/xxx.py
然后我就按照 README 所说,在项目根目录下执行 sh scripts/zzz.sh
,结果报错了,错误是
ModuleNotFoundError: No module named 'A'
这是为什么呢?
第 1 条附言 · 1 天前
按大家的说法....这就是这个项目的README本身写错了?
Latin 2 天前
from __future__ import division
from __future__ import print_function
import os.path as osp
import sys
def add_path(path):
if path not in sys.path:
sys.path.insert(0, path)
this_dir = osp.dirname(__file__)
lib_path = osp.join(this_dir, '..', 'lib')
add_path(lib_path)
misaka19000 2 天前
export PYTON_PATH=$PYTHON_PATH:/xxx/xxx/XXXProject
2i2Re2PLMaDnghL 2 天前
如果根目录下有 setup[.]py 的话,应先运行 pip install -e . (你可能会希望做一个 venv ,以免把 A 安装到系统里去)
jaredyam 2 天前
1. zzz.sh 的执行路径(在根目录)和执行方式( python A/xxx.py )没有问题
2. 问题是此时 A/xxx.py 被看作为为一个脚本文件直接执行,却使用了 from A.yyy import YY 从它外部的一个包(其实是包括自己的包,但包不包括自己不重要)导入模块 yyy ,按理来说直接 from yyy import YY 就好了,不需要考虑 A ,直接把 yyy 作为同级模块导入即可
3. 但是按照 2 的解决思路,A 的结构就显得很怪异,A 被强行看作一个包(有__init__.py ),但却又包含脚本。一般实践中,xxx.p 应该被拿出来,放在包外面,比如和 scripts/同级,然后在 zzz.sh 中 python xxx.py ,具体放哪看脚本干的事情,但放包里就是有问题
xingheng 2 天前
orzglory 2 天前
Python 是通过 __init__.py 文件来区分 普通文件夹和 package 目录的.
你 XXXProject/ 目录下, 并没有__init__.py 文件, 你的脚本, 并不会认为这是 Python 项目.
很久不写 py 了. 建议你添加个 __init__.py 文件在 XXXProject/ 目录, 再试一下.
Python 的项目路径环境, 没什么复杂的.
XIVN1987 2 天前
“from A.yyy import YY” 显然是个绝对导入,所以 python 肯定是在 sys.path 中的路径中查找 A 。。那程序要想执行只有两种方法:
1 、把 XXXProject 的路径加入 sys.path
2 、把 A 安装到现有的 sys.path 中去,比如 “lib/site-packages” 目录下
XIVN1987 2 天前
>>> import sys
>>> for x in sys.path: print(repr(x).replace(r'\\', '/'))
''
'C:/Python36/python36.zip'
'C:/Python36/DLLs'
'C:/Python36/lib'
'C:/Python36'
'C:/Python36/lib/site-packages'
```
当前目录确实在 sys.path 中,但当前目录指的是被 python.exe 直接执行的那个 xxx.py 所在的目录,所以 XXXProject/A 的路径在 sys.path 中,但 XXXProject 不在 sys.path 中。
所以题主的“from A.yyy import YY”执行出错,而一楼的“from yyy import YY”执行正常。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK