2016-04-14 76 views
0

我需要在我的python項目上執行一個函數的導入。如何在python中從父文件夾導入函數?

我知道有幾十個關於SO的類似問題,但不幸的是,我找不到合適的解決方案,因爲答案要麼太具體問題,要麼太籠統,或者他們只是醜陋黑客(如使用絕對路徑操作)。

這裏是我的文件夾結構看起來像:

PythonClient:. 
│ .gitignore 
│ des.py 
│ des_test.py 
│ des_var2.py 
│ gui.py 
│ index.py 
│ __init__.py 
│ 
├───diffie_hellman 
│ │ diffie_hellman.py 
│ │ diffie_hellman_test.py 
│ │ __init__.py 
│ │ 
│ └───__pycache__ 
│   diffie_hellman.cpython-35.pyc 
│ 
├───hashes 
│ │ collision.py 
│ │ hash_function.py 
│ │ __init__.py 
│ │ 
│ └───__pycache__ 
│   hash_function.cpython-35.pyc 
│   __init__.cpython-35.pyc 
│ 
└───__pycache__ 
     des.cpython-35.pyc 
     des_var2.cpython-35.pyc 

我需要從./diffie_hellman/diffie_hellman.py導入./hashes/hash_function.py

./hashes/hash_function.py文件包含唯一名爲hash_function的函數。

我已經嘗試了很多方法來執行導入,但不能做到這一點。 我總是要麼

SystemError: Parent module '' not loaded, cannot perform relative import

,當我在我的import語句(即from .hashes.hash_function

使用.或我得到這個:

ImportError: No module named 'hashes'

每個__init__.py文件是空的。

這是我嘗試的名單:

  1. from hashes import hash_function

  2. from hashes.hash_function import hash_function

  3. from .hashes.hash_function import hash_function

  4. from ..hashes.hash_function import hash_function

  5. import hashes

  6. import hash_function

  7. from .. import hash_function

  8. from . import hash_function

  9. from PythonClient.hashes.hash_function import hash_function


您能否幫我解決我的問題並瞭解如何使用此類導入?


PS:該解決方案不能在這裏stackoverflow.com/questions/14132789/

+1

我建議你先閱讀http://stackoverflow.com/questions/14132789/python-relative-imports-for-the-billionth-time#answer-14132912。如果仔細閱讀,可以解決99%的python導入問題。 – laike9m

回答

1

你有一個__init__.py告訴我,PythonClient本身就是一個圖書館的事實發現。做from PythonClient.hashes.hash_function import hash_function。我總是喜歡完全合格的路徑。

您還需要先安裝庫,然後才能從中導入。這需要在您的主目錄中有一個setup.py文件。之後,你應該安裝你的庫進行測試,例如`pip install -e。

+0

我的根文件夾被稱爲'PythonClient'。但是,當我從PythonClient.hashes.hash_function導入hash_function''我得到'ImportError:沒有名爲'PythonClient'的模塊 –

+0

它給了我'目錄'。'不可安裝。沒有找到'setup.py'文件。如果我必須創建'setup.py'文件,它應該是什麼樣的,它應該放在哪裏? –

+0

謝謝,創建'setup.py'解決了問題!您能否更新您的答案,以便我可以將其標記爲已回答,以便其他人可以看到答案? –

1

我知道你已經接受了一個答案,但是如果你想要一個不太「永久」的解決方案(也就是說,如果你不想要安裝你的代碼),另一種選擇是簡單地添加您的PythonClient目錄的父目錄添加到您的路徑中。這可以永久完成(取決於操作系統)或暫時編碼:

import os 
import sys 

p = os.path.abspath('../..') 
if p not in sys.path: 
    sys.path.append(p) 

from PythonClient.hashes.hash_function import hash_function 

乾杯!