2017-02-09 90 views
1

我有一大堆的Python腳本,並只是想通過把大多數人的子目錄來構建他們。但是,當我嘗試從子目錄加載腳本時,python給了我不同的錯誤消息,這取決於我如何導入子目錄腳本。Python3.5進口不起作用

我子目錄看起來是這樣的:

io 
├── dataset_creator.py 
└── read_data.py 

從父目錄我的劇本,當我做

from io import dataset_creator 

此錯誤時:

ImportError: cannot import name 'dataset_creator' 

當我做

import io.dataset_creator 
012發生

此錯誤:

ImportError: No module named 'io.dataset_creator'; 'io' is not a package 

我也感動__init__.py到IO /但它並沒有在所有幫助,以及前述點到IO /,但沒有運氣。 python文檔說,我應該添加__init__.py,然後一切都應該工作,基本上(據我解釋)。

任何人都可以幫助我嗎?如果我遺漏了一些重要信息,請告訴我,我會添加它。

乾杯, 雅各布

編輯:

正如你們許多人指出,IO已經是另一個包在Python,所以重命名我的IO /不同的解決了這一問題事(同時還具有__init__.py) 。非常感謝你! 我知道有多個正確的答案,但是,我可以將其中一個標記爲正確,對不起。

+0

''io'不是一個包'。提示:在Python中,什麼是包? – 2017-02-09 17:44:00

+0

缺少'__init __。py'? – yedpodtrzitko

+0

我的文件夾的名稱是io – StrawHat

回答

1

名稱io已被a standard library module使用。由於它是解釋器使用的非常基本的模塊之一,因此它在啓動過程中,在任何代碼運行之前都會被加載。這意味着,當Python看到您的請求導入io.dataset_creator時,它已在sys.modules中獲得io模塊。由於該模塊不是軟件包,因此它不會嘗試加載您在io軟件包中編寫的其他子模塊(即使設置了模塊搜索路徑以使軟件包位於標準庫之前)。

您應該重命名您的io包。一種選擇是把它放在另一個包裏(mypackage.io.dataset_creator應該可以正常工作)。您也可以將名稱io更換爲更具體的名稱(例如myproject_io)。

0

我已經回答了這裏Using exec on a file in a different directory causes module import errors

類似的問題追加父路徑PYTHONPATH: import sys sys.path.append("/path/to/parentfolder")

您可以使用os.path.dirname(__file__)來獲取除硬編碼路徑以外的文件絕對路徑。

__init__.py添加到您的父文件夾和文件IO,使得它比其他目錄Python包。

導入模塊: import io.dataset_creator as dcreator

parent/ 
    -- app.py 
    -- io/ 
     --dataset_creator.py 
     --read_data.py 

在你app.py:

import sys 
sys.path.append(os.path.abspath(os.path.dirname(__file__))) 
import io.dataset_creator as dcreator 
0

這發生在我身上,以及關於Python 3.5.1,當我進行了測試。

將目錄io重命名爲別的東西(我用my_io)修復了這個問題。這裏是我的測試案例:

main.py 
my_io 
├── module.py 
└── something.py 

正確導入時我改變了目錄的名稱這兩個模塊。我建議你將io目錄更改爲類似的內容以避免這種情況。

我認爲這必須與一些內部的Python模塊io有衝突。

0

重塑問題:

mkdir io 
touch dataset_creator.py 
touch read_data.py 
python3 -c 'from io import dataset_creator' 
python3 -c 'import io.dataset_creator' 

給人的錯誤消息。

解決方案:

  1. 創建一個名爲 「IO」 的另一個子目錄,並把那裏的文件。
  2. 使用與「io」不同的名稱,因爲該名稱的模塊已存在。

說明:

您已經在IO目錄,所以你不需要指定 「IO」。你可以簡單地做:

python3 -c 'import dataset_creator' 
python3 -c 'import read_data' 

而一旦你在你的Python文件添加一個函數或類:

def hello_world(): 
    print("hello world") 

可以導入這樣的:

python3 -c 'from read_data import hello_world' 

下組織代碼一個io模塊傘,創建另一個io目錄如下並用它來存儲您的python代碼:

ia (parent dir where you do the import) 
├── ia 
│ ├── dataset_creator.py 
│ └── read_data.py 
├── .gitignore 
├── requirements.txt 
├── setup.py 
└── README.md 

python3 -c 'import ia.dataset_creator' 

注意我將目錄重命名爲「ia」,並且已經有一個存在的「io」模塊(ref)。