最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python模塊引入問題和解決方案

 更新時(shí)間:2023年03月09日 09:32:01   作者:昵稱不可改  
本文主要介紹了python模塊引入問題和解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1.pycharm運(yùn)行python腳本的過程

使用pycharm等編輯器run/debug運(yùn)行python腳本時(shí),編輯器會(huì)通過本地python命令全路徑執(zhí)行腳本,例如

D:\DevelopTools\Python\python.exe D:/Codes/一長串路徑/bbss_nature_python/demo/test_no_param_in.py

并且會(huì)在python系統(tǒng)環(huán)境命令路徑prepend即append first拼接啟動(dòng)腳本的絕對(duì)目錄路徑和腳本依賴的絕對(duì)目錄路徑,例如

print ("sys.path")
['D:\\Codes\\一長串路徑\\bbss_nature_python\\demo', 'D:\\Codes\\一長串路徑\\bbss_nature_python', ...]

這是由于pycharm編輯器run/debug配置中自動(dòng)定義了全路徑工作目錄、全路徑啟動(dòng)腳本、環(huán)境命令拼接等,如下圖

2.python命令運(yùn)行python腳本常見模塊引入問題

例1

D:\Codes\cust\rycust\bbss_nature_cust_2021-2030\bbss_nature_cust>python bbss_nature_python/demo/test_no_param_in.py

在以上工作目錄,使用相對(duì)路徑運(yùn)行python腳本,報(bào)錯(cuò)如下(絕對(duì)路徑也是同樣的報(bào)錯(cuò))

Traceback (most recent call last):
   File "D:\Codes\cust\rycust\bbss_nature_cust_2021-2030\bbss_nature_cust\bbss_nature_python\demo\test_no_param_in.py", line 17, in <module>
    from common_code import ScriptReturnClz, _object2json_str
ModuleNotFoundError: No module named 'common_code'

例2

D:\Codes\cust\rycust\bbss_nature_cust_2021-2030\bbss_nature_cust>python bbss_nature_python/demo/test_no_param_in.py

在以上工作目錄,使用相對(duì)路徑運(yùn)行python腳本,報(bào)錯(cuò)如下(絕對(duì)路徑也是同樣的報(bào)錯(cuò))

Traceback (most recent call last):
   File "D:\Codes\cust\rycust\bbss_nature_cust_2021-2030\bbss_nature_cust\bbss_nature_python\demo\test_no_param_in.py", line 18, in <module>
    from ..common_code import ScriptReturnClz, _object2json_str
ImportError: attempted relative import with no known parent package

3.python命令運(yùn)行python腳本模塊引入問題的解決方案

Python在引用庫文件時(shí),會(huì)自動(dòng)從python安裝目錄的Lib子目錄等目錄查找依賴,默認(rèn)查找路徑可以通過命令print(sys.path)查看

print ("sys.path")
 
['D:\\Codes\\cust\\rycust\\bbss_nature_cust_2021-2030\\bbss_nature_cust\\bbss_nature_python\\demo', 'D:\\DevelopTools\\Python\\python310.zip', 'D:\\DevelopTools\\Python\\DLLs', 'D:\\DevelopTools\\Python\\lib', 'D:\\DevelopTools\\Pyt
hon', 'D:\\DevelopTools\\Python\\lib\\site-packages']

可以看到,python命令執(zhí)行一個(gè)python腳本前,會(huì)在sys.path數(shù)組第一位拼接啟動(dòng)腳本的目錄絕對(duì)路徑

測試用例目錄文件樹形圖如下

3.1模塊和當(dāng)前腳本在同一目錄下

在引用自定義模塊時(shí),如果模塊和當(dāng)前腳本在同一目錄下,引入的時(shí)候,有以下幾種方式:

1.直接模塊名引入√【不建議】

from test_with_param_in import _print_json_param

此時(shí),pycharm編輯器會(huì)告警,但python、pycharm運(yùn)行都是正常的

可以選擇忽略告警(告警右鍵選擇ignore)

2.包名.模塊名引入√【推薦,參見后文最佳方案】

from demo.test_with_param_in import _print_json_param

此時(shí),pycharm編輯器不會(huì)告警,但python運(yùn)行會(huì)報(bào)錯(cuò)

Traceback (most recent call last):

  File "D:\Codes\cust\rycust\bbss_nature_cust_2021-2030\bbss_nature_cust\bbss_nature_python\demo\test_no_param_in.py", line 16, in <module>

    from demo.test_with_param_in import _print_json_param

ModuleNotFoundError: No module named 'demo'

此時(shí)需要引入缺少的模塊所在的目錄的絕對(duì)路徑,如下

current_script_dir = os.path.split(os.path.realpath(__file__))[0]
current_script_dir_parent = os.path.split(current_script_dir)[0]
sys.path.insert(0, current_script_dir_parent)

3..模塊名引入×【不可行】

from .test_with_param_in import _print_json_param

此時(shí),pycharm編輯器不會(huì)告警,但python運(yùn)行會(huì)報(bào)錯(cuò)

Traceback (most recent call last):

  File "D:\Codes\cust\rycust\bbss_nature_cust_2021-2030\bbss_nature_cust\bbss_nature_python\demo\test_no_param_in.py", line 16, in <module>

    from .test_with_param_in import _print_json_param

ImportError: attempted relative import with no known parent package

無解決方案

3.2模塊和當(dāng)前腳本在不同目錄下

如果模塊和當(dāng)前腳本不在同一目錄下,必須指定模塊路徑,可以在當(dāng)前腳本中import sys然后

通過sys.path.append(‘待引入的模塊路徑’)或者sys.path.insert(0,‘待引入的模塊路徑’)拼接的方式加入python系統(tǒng)命令路徑,建議insert

待引入的模塊路徑,應(yīng)該使用絕對(duì)(abs)路徑,對(duì)于相對(duì)路徑,python會(huì)直接拼接工作目錄+相對(duì)路徑生成絕對(duì)路徑,拼接后的絕對(duì)路徑是錯(cuò)誤的(除非工作目錄本身就是啟動(dòng)腳本的目錄)

腳本內(nèi)容:

# 當(dāng)前腳本abs目錄
current_script_dir = os.path.split(os.path.realpath(__file__))[0]
# 當(dāng)前腳本目錄的上級(jí)abs目錄(對(duì)于本測試用例即為待引入模塊的abs目錄)
current_script_dir_parent = os.path.split(current_script_dir)[0]
# 待引入模塊common_code的abs目錄加入系統(tǒng)環(huán)境命令路徑數(shù)組
 
sys.path.insert(0, current_script_dir_parent)
print("print (\"sys.path\")")
print(sys.path)
 
# 引入自定義模塊common_code【注意,代碼中必須先添加路徑之后才能引入】
 
from common_code import ScriptReturnClz, _object2json_str

命令:

D:\Codes\cust\rycust\bbss_nature_cust_2021-2030\bbss_nature_cust>python bbss_nature_python/demo/test_no_param_in.py

運(yùn)行結(jié)果:

print ("sys.path")
 
['D:\\Codes\\cust\\rycust\\bbss_nature_cust_2021-2030\\bbss_nature_cust\\bbss_nature_python', 'D:\\Codes\\cust\\rycust\\bbss_nature_cust_2021-2030\\bbss_nature_cust\\bbss_nature_python\\demo', 'D:\\DevelopTools\\Python\\python310.zi
p', 'D:\\DevelopTools\\Python\\DLLs', 'D:\\DevelopTools\\Python\\lib', 'D:\\DevelopTools\\Python', 'D:\\DevelopTools\\Python\\lib\\site-packages']

4.python命令運(yùn)行python腳本模塊引入的最佳方案

4.1復(fù)雜工程的依賴遍歷問題

當(dāng)待引入的模塊和當(dāng)前腳本在不同目錄下時(shí),需要在環(huán)境變量中加入待引入模塊目錄的絕對(duì)路徑,每個(gè)類似的啟動(dòng)腳本(即python命令執(zhí)行的腳本)都需要編寫很多類似的模板代碼,而且由于依賴的傳遞性,可能無法簡單地遍歷出所有的自定義依賴模塊

4.2 IDE的依賴默認(rèn)引入方式

復(fù)雜依賴的python腳本,尤其是系統(tǒng)級(jí)規(guī)?;膒ython工程,通常使用pycharm等IDE編寫。IDE會(huì)創(chuàng)建python工程,并且以工程目錄為工作目錄,在編寫py腳本時(shí),從工作目錄開始查找自定義模塊,自動(dòng)補(bǔ)齊工作目錄下的相對(duì)路徑。另外,在打包python工程時(shí),也是從工程目錄開始。因此,使用IDE的默認(rèn)的補(bǔ)全模塊路徑的依賴引入方式是最優(yōu)選擇

4.3多工程依賴的解決方案

不同于java微服務(wù)子工程之間的依賴引用,python沒有子工程概念,只有一個(gè)完整的未拆分的工程。如果兩個(gè)工程之間有模塊依賴關(guān)系,則需要同時(shí)部署兩個(gè)工程,并使用絕對(duì)路徑引入另一個(gè)工程的工程目錄,然后從工程目錄開始引入所需模塊。對(duì)于常用的自定義的基礎(chǔ)依賴,也可以打包發(fā)布到公有源或私有源,直接install引入模塊。從工程角度考慮,需要區(qū)分模塊的命名空間,應(yīng)采用和java包名類似的方式,以組織或個(gè)人的標(biāo)識(shí)創(chuàng)建模塊總包

4.4找到python工程的工程目錄【方案本案】

鑒于IDE的依賴引入方式,只要將python工程的工程目錄加入sys.path,則工程內(nèi)的任何一個(gè)pycharm可成功運(yùn)行的啟動(dòng)腳本都可以用python命令成功運(yùn)行

怎樣可以方便地找到一個(gè)python工程的工程目錄?這取決于一個(gè)工程有多少啟動(dòng)腳本,以及每個(gè)啟動(dòng)腳本的位置

如果一個(gè)python工程只有一個(gè)啟動(dòng)腳本,比如一個(gè)python文件服務(wù)器,那么這個(gè)腳本應(yīng)該直接放在工程一級(jí)目錄下(如下圖中工程目錄為D:\tmp\python,start.py為啟動(dòng)腳本),這樣可以順利找到當(dāng)前工程中的所有自定義依賴,這是因?yàn)閱?dòng)腳本路徑自動(dòng)拼接環(huán)境變量

如果一個(gè)python工程有多個(gè)啟動(dòng)腳本,并且不是都在工程目錄下,比如一個(gè)python計(jì)算工具包,那么每一個(gè)啟動(dòng)腳本的全局代碼塊都需要添加工程目錄,舉例如下

# 當(dāng)前腳本abs目錄
current_script_dir = os.path.split(os.path.realpath(__file__))[0]
# 當(dāng)前腳本目錄的上級(jí)abs目錄(對(duì)于本測試用例即為python工程abs目錄,如果不是,可繼續(xù)上溯)
current_script_dir_parent = os.path.split(current_script_dir)[0]
# python工程路徑
python_project_dir = current_script_dir_parent
if sys.path[0] != python_project_dir:
    sys.path.insert(0, python_project_dir)
    print("添加工程目錄:" + python_project_dir)
    print("print (\"sys.path\")")
    print(sys.path)

到此這篇關(guān)于python模塊引入問題和解決方案的文章就介紹到這了,更多相關(guān)python模塊引入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用python切片實(shí)現(xiàn)二維數(shù)組復(fù)制示例

    使用python切片實(shí)現(xiàn)二維數(shù)組復(fù)制示例

    今天小編就為大家分享一篇使用python切片實(shí)現(xiàn)二維數(shù)組復(fù)制示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Python利用PyPDF2快速拆分PDF文檔

    Python利用PyPDF2快速拆分PDF文檔

    很多時(shí)候需要拆分PDF,但是大部分需要付費(fèi),免費(fèi)的限制很多,本文就使用Python快速拆分PDF文檔,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-07-07
  • 安裝Pycharm2019以及配置anconda教程的方法步驟

    安裝Pycharm2019以及配置anconda教程的方法步驟

    這篇文章主要介紹了安裝Pycharm2019以及配置anconda教程的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Python找出文件中使用率最高的漢字實(shí)例詳解

    Python找出文件中使用率最高的漢字實(shí)例詳解

    這篇文章主要介紹了Python找出文件中使用率最高的漢字,涉及Python針對(duì)字符串與中文的相關(guān)操作技巧,需要的朋友可以參考下
    2015-06-06
  • django中的setting最佳配置小結(jié)

    django中的setting最佳配置小結(jié)

    setting配置也經(jīng)常將一些配置混淆今天主要是介紹django中的setting最佳配置小結(jié),需要的朋友參考下吧
    2017-11-11
  • Python與AI分析時(shí)間序列數(shù)據(jù)

    Python與AI分析時(shí)間序列數(shù)據(jù)

    預(yù)測給定輸入序列中的下一個(gè)是機(jī)器學(xué)習(xí)中的另一個(gè)重要概念.本章為您提供有關(guān)分析時(shí)間序列數(shù)據(jù)的詳細(xì)說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-05-05
  • 深入探討Python中的內(nèi)置類屬性`__repr__`

    深入探討Python中的內(nèi)置類屬性`__repr__`

    在Python中,__repr__是一個(gè)特殊的內(nèi)置類屬性,用于定義類的字符串表示形式,本文將深入探討__repr__的作用、用法以及一些實(shí)際應(yīng)用場景,希望對(duì)大家有所幫助
    2023-12-12
  • Python模仿POST提交HTTP數(shù)據(jù)及使用Cookie值的方法

    Python模仿POST提交HTTP數(shù)據(jù)及使用Cookie值的方法

    這篇文章主要介紹了Python模仿POST提交HTTP數(shù)據(jù)及使用Cookie值的方法,通過兩種不同的實(shí)現(xiàn)方法較為詳細(xì)的講述了HTTP數(shù)據(jù)通信及cookie的具體用法,需要的朋友可以參考下
    2014-11-11
  • python基于tkinter制作無損音樂下載工具(附源碼)

    python基于tkinter制作無損音樂下載工具(附源碼)

    這篇文章主要介紹了python基于tkinter制作無損音樂下載工具(附源碼),幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • python進(jìn)行二次方程式計(jì)算的實(shí)例講解

    python進(jìn)行二次方程式計(jì)算的實(shí)例講解

    在本篇內(nèi)容里小編給大家整理了一篇關(guān)于python進(jìn)行二次方程式計(jì)算的實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-12-12

最新評(píng)論

万州区| 黄石市| 噶尔县| 松江区| 渭南市| 双桥区| 台东县| 深水埗区| 蒙自县| 隆回县| 黑山县| 理塘县| 娱乐| 涞水县| 怀安县| 济源市| 于都县| 景谷| 巴东县| 津市市| 阜南县| 营口市| 海原县| 滕州市| 辉南县| 鄂托克前旗| 噶尔县| 泗水县| 阿拉尔市| 固安县| 碌曲县| 松溪县| 页游| 黄冈市| 泰顺县| 伊吾县| 巴林左旗| 聂拉木县| 贵溪市| 景泰县| 宜阳县|