python找不到包的總結: ImportError: No module named

python找不到包的總結: ImportError: No module named

python找不到包的總結: ImportError: No module named_python import找不到包-CSDN博客

ImportError: No module named
先寫解決套路
1. 環境安裝包
2. 自己寫的包
1. 自己寫的包
原因1: python2 沒有加 `__init__.py`
原因2. 沒有加入包的root路徑
2. 環境的安裝包
3. VSCode 配置
1. 配置運行參數
參考文獻
寫一個筆記方便自己以後回查


先寫解決套路
1. 環境安裝包
用which python檢查當前解釋器使用的是哪個python
查看當前解釋器的site-packages文件夾裏是否包含了自己要引入的包
沒有的話可以把單獨下載的解壓包複製進去再寫個.pth文件在site-packages文件夾裏一樣可以用
若是pip下的, 用show pip 包名 或者 conda list 查看有沒有正確安裝以及安裝路徑
沒有的話就安裝pip install or conda install, 注意用which pip or conda檢查用的是哪個來進行安裝的
2. 自己寫的包
打印sys.path查看自己的寫的包在不在引用路徑上
不在就要麼在解釋器的site-pakages文件夾里加寫了包路徑的.pth文件
要麼就是在使用import的py文件里加入sys.path.append(引用的包路徑)
此時查看自己引用的包裏要導入的模塊或文件層級間是否添加__init__.py
如果沒有,那麼添加進去, __init__.py文件裏不需要有任何內容

1. 自己寫的包

原因1: python2 沒有加 __init__.py
python 3.3以後的版本,你要是建立一個python程序包的話,它會自動隱式地給你添加 __init__.py文件.
但如果你運行的python解釋器比3.3早的話, 比如python2.7, 那麼如果你不手動添加 init.py 文件
它就不會添加, 於是會找不到包, 因爲 __init__.py 文件是python認爲這文件夾是包的標誌
舉例來說:
這是我的文件目錄

├── semantic_segmentation_zoo
│ ├── cnn_basenet.py
│ ├── vgg16_based_fcn.py
1
2
3
在 文件 vgg16_based_fcn.py 寫入引用包的語句如下:

from semantic_segmentation_zoo import cnn_basenet
1
會運行不起來,報錯找不到包. 這時如果加上 __init__.py 文件,像下面這樣

├── semantic_segmentation_zoo
│ ├── cnn_basenet.py
│ ├── __init__.py
│ ├── vgg16_based_fcn.py
1
2
3
4
就沒問題, 因爲系統就會先運行 __init__.py 然後表示semantic_segmentation_zoo這是個文件包,裏面的文件可以用來引用.

第二個例子的文件目錄如下:

├── scripts
│ ├── config
│ │ ├── global_config.py
│ │ ├── __init__.py
│ ├── lanenet_node.py
│ ├── semantic_segmentation_zoo
│ │ ├── cnn_basenet.py
│ │ ├── __init__.py
│ │ ├── vgg16_based_fcn.py
1
2
3
4
5
6
7
8
9
然而如果我多來一句:

import config
1
就依然會報錯ImportError: No module named config
因爲 在config,lanenet_node.py文件的層級(script文件夾下)裏沒有__init__.py
如果加上__init__.py,像下面這樣

├── scripts
│ ├── __init__.py
│ ├── config
│ │ ├── global_config.py
│ │ ├── __init__.py
│ ├── lanenet_node.py
│ ├── semantic_segmentation_zoo
│ │ ├── cnn_basenet.py
│ │ ├── __init__.py
│ │ ├── vgg16_based_fcn.py
1
2
3
4
5
6
7
8
9
10
就可以找到, 因爲系統首先會在程序包目錄下(script)運行__init__.py 表示這個路徑下的文件和文件夾可以當包使用, 然後再到config文件夾下運行__init__.py 表示config文件夾下的文件可以引用,套娃.


原因2. 沒有加入包的root路徑
上面的原因1其實會引申出原因2, 那就是如果我引用的文件夾在10萬8千里遠的文件夾裏, 而且是自己寫的一個工程包. 並不是python安裝好的工程包, 也很容易出現找不到包的報錯.
首先文件找包是先通過系統路徑來找的,也就是你程序的root路徑,可以通過在python文件裏打下面代碼來查看

import sys
print(sys.path)
1
2
會有好幾個路徑反饋如下:

>>> import sys
>>> sys.path
['', '/opt/ros/melodic/lib/python2.7/dist-packages', '/home/xxx/anaconda3/lib/python37.zip', '/home/xxx/anaconda3/lib/python3.7', '/home/xxx/anaconda3/lib/python3.7/lib-dynload', '/home/xxx/anaconda3/lib/python3.7/site-packages']
>>>
1
2
3
4
系統會從上面這個列表中去找包的路徑,這也就是爲啥我們有些系統包總可以找的到,因爲那些python系統包或者anaconda環境下的工具安裝包默認寫在路徑裏了,大多都在site-packages文件夾裏

'/home/xxx/anaconda3/lib/python3.7/site-packages'
1
注意 上面的列表最開頭有個 ''這個很關鍵,因爲它代表的是當前使用的程序包(也就是你寫import 運行然後出現找不到包報錯的那個程序包)的路徑,相當於命令行裏的./

這就是爲啥當前程序包下的一些文件在解決了上文原因1以後就好找了,其它隔了10w8千里遠的包不好找的原因, 因爲前程序包下的一些文件在路徑./下啊, 而其它遠的不在這個找包路徑的列表裏啊.

所以一般可以通過兩種辦法解決

在要運行的.py文件開頭加這兩句
import sys
sys.path.append('調用的包的路徑')
1
2
在運行環境的python解釋器的site_pakages文件夾下添加.pth 文件比如
cd /home/xxx/anaconda3/lib/python3.7/site-packages
sudo echo "要引用的包的文件目錄比如:/home/haha" > 自己寫名字.pth
1
2
這裏要注意, 加入.pth文件時要加入的路徑是包的最外層路徑, 接着交給每個目錄下的__init__.py文件就好啦, 一般找不到是因爲你放的路徑可能還是不夠外, 因爲有時候喜歡用from xxx import yyy導入,
我的意思是
注意工程裏面用 from xxx import yyy 的語句, 此時需要添加的路徑是包含xxx的文件夾的路徑, 而非xxx的路徑
此時如果不夠外,系統還是會看不到xxx文件


2. 環境的安裝包
先說一下python內核自帶或者pip安裝等等的工程包比如sys, nunpy會統一安裝在一個固定的目錄,比如 :/usr/local/lib/python3.6/dist-packages或者/home/XXX/anaconda3/lib/python3.7/site-packages這些人家在你安裝的時候就已經給你安排妥當了,真出問題了就只能硬着頭皮找了

pip環境包
這種情況多半是沒用對環境,可以終端輸入下面的命令看看是否安裝,以及安裝的位置,使用的是哪個環境
which pip
pip show 包名
1
2
系統的默認環境路徑
終端輸入命令
python -m site
1
conda 的,涉及虛擬環境也一樣
一般都在base環境或者虛擬環境的site_pakages 文件夾裏,比如

/home/xxx/anaconda3/lib/python3.7/site-packages
1
3. VSCode 配置
1. 配置運行參數
左上角 -> run -> open Configurations -> launch.json
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"args": ["-d", "./Dataset", # 各個運行參數 一行 一對
"-s", "00"
],
"env": {"PYTHONPATH":"${workspaceRoot}"}, # 把工程文件夾作爲工程系統根路徑
"envFile": "${workspaceFolder}/.env", # 添加工文件夾下.env文件裏的路徑到系統路徑上
# "debugOptions": [
# "WaitOnAbnormalExit",
# "WaitOnNormalExit",
# "RedirectOutput"
]
}
]
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
在工程文件夾(就是你vscode openfolder打開的那個文件夾下) 創建一個.env文件,在這個文件裏寫上你特定要加入的包的路徑,這個路徑會自動加入工程的系統根目錄裏,
如.env文件裏寫入:
PYTHONPATH=/home/foia/Desktop/xxx
1
注意.env 文件夾需要放置的位置,不要不小心放到了.vscode文件夾裏哦, 另外也要遵循注意工程裏面用 from xxx import yyy 的語句, 此時需要添加的路徑是包含xxx的文件夾的路徑, 而非xxx的路徑 這一條規則哦

code runner 小tip, shift + ctrl + P 輸入setting.json 選擇 default setting.json 打開, 找到"code-runner.executorMap", “python”: “python -u”, 改成 “python.pythonPath: 你的虛擬環境解釋器運行文件地址”, 可以讓code runner 運行conda虛擬環境
參考文獻
https://python3-cookbook.readthedocs.io/zh_CN/latest/c10/p09_add_directories_to_sys_path.html

https://www.cnblogs.com/maggieq8324/p/12099068.html

https://blog.csdn.net/weixin_30625691/article/details/96115379

https://www.bbsmax.com/A/xl56eN8kJr/

https://www.bbsmax.com/A/xl56eN8kJr/

python 中pyc文件介紹

解決:VScode中 import 後出現no module的問題
————————————————
版權聲明:本文爲CSDN博主「GungnirsPledge」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/GungnirsPledge/article/details/107586458

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章