python 導入模塊的坑。為什么整個項目能運行,單獨運行某個文件模塊就報錯?多層目錄不同文件夾怎么導入?


一些文章介紹了python不同目錄怎么導入問題,但py文件運行起點卻從來沒有文章說過!這是相當重要的!!

 這個連接是網上99%的所講的導入 https://www.cnblogs.com/luoye00/p/5223543.html

網上99%都是講x導入y模塊,是以x為起點運行的,這和此篇角度完全不同。比如下面的從run開始運行,k怎么導入a,k怎么導入j,網上講得都是直接運行k,如果用網上的方法來在k中寫導入j和a,然后從run運行,k文件里面的導入一定會出錯。

 

此篇以python3為例,python3和python2導入時候有一些區別,不講python2。

 

 

 整個項目如圖上,整個項目從run文件運行起來。

 

dirx里面的__init__文件是空文件,如下圖

 

a.py也是空文件,只是演示導入,就不寫什么了。

 

 

pacx里面的

__init__.py是空文件

j.py 也是空文件

k.py的正確內容的姿勢應該是這樣,k模塊導入了同級目錄的j模塊,導入了dirx包的a模塊。看起來是不心里發慌了,第8行有紅色波浪線,是不是代碼寫得有bug了?

第5行,from pacx import j,還可以使用from . import j

 

 

 下圖是 run.py的代碼

 

 這樣做后,不管是從pycahrm右鍵運行run.py還是從cmd敲入指令 python run.py,都能很好的打印出 hello和over。

 

 

不正確的姿勢是在k文件中直接import j,如圖

 

 這樣,直接運行k文件沒事,下面來運行run文件,在cmd里面使用py3運行run文件會出錯(py2的導入方式和py3不同,py2不會出事),出錯如下圖

出錯的文件是k文件的第6行,第6行直接導入j模塊,報錯找不到j了!!!

 

 

一定要使用從cmd運行 或者從shell運行run。 上面這些文件放到不同的位置,在pycahrm不一定報錯,也不一定不報錯,pycahrm自動加了一些目錄到sys.path了,如果老是用pycahrm運行,可能一部署就掛了,代碼最終運行起來,肯定不是從pycahrm運行run.py,一定是cmd shell這種。  不信的人可以把文件夾分別放到項目目錄下面和建立一個很深的文件夾,從pycharm運行run就知道了。

 

 k文件的代碼

#coding=utf8


from pacx import j

# import j

from dirx import a


print ('hello')

 

上面這是正確的,但是直接運行k文件會報錯。不正確的代碼有:

#from pacx import j

import j

#from dirx import a

這樣從run運行找不到j了。


k模塊引入dirx包的a模塊,怎么導入?很多人覺得是要寫sys.path.apend,是這樣嗎?可以看到,django項目文件夾下面的同名文件夾的urls文件,引入一個app中的views,是from xxapp import views就行了。
直接
from dirx import a就可以使用了,k模塊的這行與紅色波浪線不要緊,因為運行起點不在k模塊紅色怕什么。



還有人可能,別人給了他應該項目,他試圖直接運行項目中的某一個文件,他會納悶說為什么從整體運行沒事,為什么一運行某個文件就不行了?
如果從k模塊開始運行,
k文件里面的 from pacx import j
這一行會報錯。

那么一定要注意的就是運行起點,還有就是項目部署前至少從cmd /shell運行一次,pycahrm運行是不同的靠不住的,默認是添加了幾個目錄到syspath,這需要設置。



項目的運行起點很重要,可以使用os.getcwd()查看當前工作目錄。

不但是導入模塊的問題,還有讀取文件的也和項目運行起點有關。

下圖是一個django項目

 

 test1109文件調用模型文件gdbt.pkl,

可以看到我在test1109同級目錄放了一個gdbt.pkl模型文件

在manage.py也放了一個gdbt.pkl模型文件,按道理test1109模塊讀取的是同級目錄的模型文件,但其實刪了同級目錄下的模型文件項目會運行無誤,反而如果刪除了manage.py同級目錄的模型文件,會出錯,會找不到文件。

因為當前工作目錄設置了manage.py目錄。

 

但是不從網絡訪問時候,需要用本地函數直接調試調用模型是有問題的,我在test1109文件的目錄下面也放了一個gdbt.pkl模型文件。這樣就在本地測試和網絡訪問都不會有問題,但要放兩次,這是隱式地用了相對路徑。直接寫模型文件的磁盤路徑當然也可以,不靈活。最好是在代碼操作文件的地方使用__file__的絕對路徑去定位其他文件,這樣不管是外層啟動還是是內層啟動都能定位到唯一的地方。



模塊導入和python編碼一樣重要,在py編程中這兩種東西一定要單獨花時間弄精通,不能模棱兩可,每次出事都靠猜。

只有笨瓜豬才會說什么都不管,一切設置utf8,不碰py2只用py3就不會碰到編碼問題這么弱的話。因為見過不少使用py3還仍然被編碼報錯或者亂碼問題的困擾人。



2、直接使用cmd和shell啟動python,一個快速與pycahrm運行保持一致的方法是,在運行python命令前,設置一個PYTHONPATH環境變量,路徑是你的項目文件夾的頂層目錄。有些人可能疑惑了,你電腦有十幾個項目,設置個環境變量不會互相干擾嗎?這是不會發生的,因為只是用命令設置環境變量,而沒有去永久性的修改環境變量的配置文件,那么環境變量只在當前會話窗口有效。絕對不會發生干擾問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM