1. 程式人生 > 程式設計 >關於Python3的import問題(pycharm可以執行命令列import錯誤)

關於Python3的import問題(pycharm可以執行命令列import錯誤)

以前從來沒有寫過特別多的程式碼,這次在閱讀論文的時候跑別人的程式碼的時候出現了很多import的問題,這裡我想跟大家分享一下,我在Ubuntu系統,使用的是anaconda3,版本為3.6,我一般會在pycharm上跑程式碼,但是有時候pycharm上跑通的程式碼,在命令列下總出現import的問題,所以這裡來總結一下,我就舉個簡單的例子吧!

一、同一目錄下的import

下面是我的文件的結構:你可以看到在工程tfexe下,存在兩個資料夾一個是datasets,一個是parallel,dataset下還有一個in資料夾和一個out.py檔案,in資料夾裡面存在b.py和bb.py兩個檔案。parallel資料夾下存在的是兩個檔案a.py和aa.py。(推薦您先建立好這個結構)

a.py檔案程式碼:

def say_hello():
  print("hello world!")

aa.py檔案程式碼:你可以看到是呼叫a.py裡面的函式say_hello(),但是在pycharm這裡是報錯的,但是可執行,你可以設定將資料夾設定成source root就可以讓他不顯示錯誤了,但是無所謂啦!

import os
import sys
print("當前的工作目錄:",os.getcwd())
print("python搜尋模組的路徑集合:",sys.path)
from a import say_hello
say_hello()

其他暫且無用,這裡先不展示!

(1)pycharm執行結果

右擊aa.py,來執行,你會觀察到下面的結果:很顯然,我們的a.py成功的呼叫了aa.py檔案的函式say_hello()。

你可以看到當前的工作目錄是什麼,那就是aa.py檔案所在的絕對地址。

關注重點,你可以看到Python搜尋模組的路徑集合,重點是前兩個,你看到在pycharm上直接run執行的,我們的搜尋路徑有總的工程的絕對路徑還有執行的檔案所在的路徑。

關於Python3的import問題(pycharm可以執行命令列import錯誤)

(2)命令列執行結果

需要你切換到parallel的資料夾下,然後執行aa.py,觀察可得這個結果也是正確的。

你看出與上面的區別了嗎?很顯然,當前的工作路徑全部都是一樣的,但是我們的Python的搜尋模組的路徑少了什麼呀?觀察第二個,你會發現,哇哦,少了我的整個工程所在的絕對路徑。因為這裡parallel的絕對路徑是存在的,所以在搜尋a模組的時候,發現是可以搜尋到的,因為a就在parallel這個絕對路徑的下面,當然是可以搜尋到的,但是如果你需要呼叫別的資料夾的東西呢?很顯然,這裡就要出錯啦~詳見下一節

關於Python3的import問題(pycharm可以執行命令列import錯誤)

總結:import同一資料夾下的模組是可以在pycharm還有命令列下都是可以執行的!

二、不同的目錄下的import

b.py檔案的內容:

def say_goodbye():
  print("goodbye!")

bb.py檔案的內容:

import os
import sys
print("當前的工作目錄:",os.getcwd())
print("python搜尋模組的路徑集合",sys.path)
#引入同一資料夾下的模組
from b import say_goodbye
say_goodbye()

# #引入與本資料夾同級的資料夾
# from in2 import c
# c.say()

#引入與本資料夾的上級資料夾同一級的資料夾下的模組
from parallel import a
a.say_hello()

c.py的檔案內容:

def say():
  print("say yes")

(1)pycharm執行結果

你會發現,在pycharm上import不同資料夾下的模組居然成功了,這是為什麼呢?你看Python的搜尋模組的路徑出來的結果,裡面包含了,我這個總的工程tfexe的絕對路徑,所以在引入parallel的時候自然是成功的,因為parallel在我們的搜尋路徑上。所以我推測啊,pycharm自動的將整個工程的絕對路徑加入sys.path,也就是Python的模組搜尋路徑!

關於Python3的import問題(pycharm可以執行命令列import錯誤)

但是你肯定看到了我註釋掉了那個進入in2模組的,為什麼註釋掉,因為跑不通啊,為什麼跑不通呢?因為in2模組,沒有搜到,很尷尬呀~那沒搜到肯定是因為我的Python的搜尋路徑不包含這裡,仔細觀察結果,你發現只有tfexe的絕對路徑和in的絕對路徑,in2確實不在,怎麼處理,把它加上絕對路徑不就好了!

關於Python3的import問題(pycharm可以執行命令列import錯誤)

加上能夠搜尋到in2的絕對路徑:那不就是datasets的絕對路徑嘛!

在上面的bb.py裡面新增上程式碼

#-----這裡是加上in2的絕對路徑的操作程式碼------
sys.path.append("/home/syq/PycharmProjects/tfexe/datasets")

關於Python3的import問題(pycharm可以執行命令列import錯誤)

從執行結果來看,你會發現居然都成功了,這都歸功於sys.path!

(2)命令列執行結果

很顯然啊,這裡報錯了,為什麼呢?他說模組parallel不存在,為什麼明明之前的在pycharm上可以執行在這裡不行了呢?

我們在命令列執行註釋掉in2的那個部分的程式碼,也就是(1)裡面的未更改之前的bb.py的程式碼:為了防止大家搞混,我在這裡在貼一下bb.py的程式碼:

import os
import sys
print("當前的工作目錄:",sys.path)
#引入同一資料夾下的模組
from b import say_goodbye
say_goodbye()

# #引入與本資料夾同級的資料夾
# from in2 import c
# c.say()

#引入與本資料夾的上級資料夾同一級的資料夾下的模組
from parallel import a
a.say_hello()

結果:觀察到報錯了,報錯parallel這個模組居然不存在,很顯然觀察sys.path的輸出,你發現少了之前的tfexe的絕對路徑,這就是parallel找不到的原因,因為他壓根不在搜尋路徑上,所以這裡我在bb.py的程式碼基礎上新增上能夠搜到parallel的搜尋路徑。

關於Python3的import問題(pycharm可以執行命令列import錯誤)

修改後的bb.py的程式碼:

import os
import sys
print("當前的工作目錄:",os.getcwd())
sys.path.append("/home/syq/PycharmProjects/tfexe")
print("python搜尋模組的路徑集合",sys.path)

#引入同一資料夾下的模組
from b import say_goodbye
say_goodbye()

# #引入與本資料夾同級的資料夾
# from in2 import c
# c.say()

#引入與本資料夾的上級資料夾同一級的資料夾下的模組
from parallel import a
a.say_hello()

程式碼執行結果:注意我把未改之前的bb.py的執行結果也放在了這裡,你可以觀察到兩者的差別所在,你就會發現,哦原來啊,下面的sys.path比更改之前的path多了一個可以搜尋到parallel的絕對路徑了,很顯然就能成功的運行了!

關於Python3的import問題(pycharm可以執行命令列import錯誤)

現在你差不多懂了吧,當你遇到了import的錯誤,你只需要輸出sys.path來看看能不能搜尋到你要加入的模組,如果不行就自己手動的新增!

在引入in2模組試試看!

bb.py檔案的內容:

import os
import sys
print("當前的工作目錄:",os.getcwd())
sys.path.append("/home/syq/PycharmProjects/tfexe")
sys.path.append("/home/syq/PycharmProjects/tfexe/datasets")
print("python搜尋模組的路徑集合",sys.path)

#引入同一資料夾下的模組
from b import say_goodbye
say_goodbye()

#引入與本資料夾同級的資料夾
from in2 import c
c.say()

#引入與本資料夾的上級資料夾同一級的資料夾下的模組
from parallel import a
a.say_hello()

不管是在命令列還是pycharm都是可以得到結果的!

關於Python3的import問題(pycharm可以執行命令列import錯誤)

到此這篇關於關於Python3的import問題(pycharm可以執行命令列import錯誤)的文章就介紹到這了,更多相關Python3 import出錯內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!