Python导入运行的当前模块报错
引言
今天遇到了一個奇怪的現象,簡單舉個栗子:
文件結構如下:
其中tt.py文件中定義了一個方法:
def tt():print('tt')我現在要在test.py中使用tt(), 代碼如下:
from test.tt import tt ? if __name__ == '__main__':tt()以上導入模塊是編譯器自動導入的,運行后直接報錯:
說沒有找到這個模塊,然后我將導入換成相對路徑
可以看到編譯器是有報錯提示的,但是運行完全沒有問題。
將路徑換成相對路徑試試呢?
很好,編譯器是認識的,但是不好意思運行報錯
那么問題來了,問什么編譯器的自動導包會出現問題呢?這編譯器也太不智能了。
探究
眾所周知,Python模塊導入的查找路徑可以通過sys.path查看,我看了一下:
['/home/hujing/workspace/python/python_demo/test', '/home/hujing/workspace/python/python_demo', '/usr/share/pycharm/helpers/pycharm_display', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/home/hujing/.local/lib/python3.5/site-packages', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages', '/usr/share/pycharm/helpers/pycharm_matplotlib_backend']
在第一個路徑下找tt可以找到,這也是上面正確運行的,沒有問題
在第二個路徑下找test.tt,應該也可以找到啊,為什么會提示找不到呢?
相對路徑查找為什么也找不到呢?在網上找了找,沒有找到能夠解決我問題的答案,那我就只好自己探究了。
嘗試
首先,無法導入本包下的其他模塊,嘗試在其他模塊中導入:
新建模塊并導入剛才的test模塊, 文件結構如下:
其中fun_test.py文件只有一句:import test.test
先嘗試一下剛才運行的模式:
不出意外會報錯,因為運行路徑已經換到fun目錄下了,果不其然
再嘗試一下剛才編譯器的做法:
正常:
相對路徑經過嘗試也是正常的。
思考
那我就奇怪了,為什么換個模塊運行就可以。就不能正常導入自己包的模塊嗎?還是說python沒有把運行路徑當做包?
我覺得應該是后者,Python不會將執行的文件路徑作為一個包來處理,在我經過一些其他的嘗試之后,暫時看到的確實是這樣。故而也就無法通過導入包的形式來導入了。
這只是我經過嘗試,暫時得出的粗淺結論,目前還沒有找到相關內容的說明,若哪位了解,還望不吝賜教。
項目路徑
再有一個問題,Pycharm中運行正常,但是使用cmd直接運行就會報錯,很簡單,輸出sys.path,可以看到兩者的不同,Pycharm非常貼心的講我們項目的運行根路徑添加進去了,在命令行運行就需要手動添加了。當然,你也可以選擇講各種自己的包都放到系統路徑下,或者直接在系統路徑下添加項目路徑。
?
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Python导入运行的当前模块报错的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 强行更改linux服务器时间,加强Lin
- 下一篇: Android Activity 生命周