2016-08-05 12 views
0

我知道這裏有很多類似的問題,但我無法弄清楚哪些項目最適合我。這是通過以下方式組織了一個小型的數據研究項目:在中小型數據科學項目中輸入絕對路徑

project-name/ 
    docs/ 
    src/ 
     __init__.py 
     config.yml 
     Makefile 
     data/ 
     data_management/ 
      __init__.py 
      process1.py 
      process2/ 
     analysis/ 
      __init__.py 
      analysis1.py 
      analysis2/ 
     library/ 
      __init__.py 
      config.py 

Makefile文件的根目錄隨後執行一些腳本坐在data_management(準備原始數據)和analysis,或分別在其子目錄(自有些過程有時是相當廣泛的)。

這些模塊中的每一個都是自包含的 - 除了它們都從library dir導入(並因此共享)函數/類(我認爲應該避免違反自包含模塊的原則,但我不知道如何解決它而不必複製functinos)。一個例子是在config.py我的配置類(管理數據庫信息,路徑相關的子目錄,不同的用戶規格等)

問題:我最好的找到它,如果我能在這些腳本的絕對導入路徑,即如果我可以在項目的任何地方寫import library.config。但感覺不對有

# project-name/src/data_management/process1/data_to_sql.py  
import os 
import sys 
sys.path.insert(0, os.path.abspath('..')) 
import library.config 
config = library.config.Configuration() 

在此之上或任何其他腳本(因爲要訪問我的「路徑管理系統」,我碰上指定路徑的問題)。

問題:如何避免必須在任何文件中使用sys.path.insert?我應該避免編輯PYTHONPATH?如果沒有,我怎樣才能在makefile中自動執行這個設置(因爲最終我想與其他人分享這個代碼)?

謝謝。

編輯:我使用Python 2.7.11。

回答

0

幾點:

  1. 如果是這樣的Python 2.7,你必須有__init__.py在每個目錄,使其可導入。 Python 3不需要。
  2. 由於makefile是從src內運行的,因此這是導入的基礎。每個腳本將需要sys.path.insert(0, '.'),然後隨意有from analysis.analysis1 import foo, bar
  3. 退房https://github.com/pypa/sampleproject一個推薦的方式來包裝你的腳本,使他們可以分發,安裝,甚至從PYTHONPATH例如所謂通過運行python -c 'import mypackage
0

我注意到,當你寫了關於配置文件,你寫了'config.py'。但是在你的代碼中,它似乎是一個.yml文件。

,如果您選擇使用.py文件,你可以這樣訪問:

from src import config 
+0

雖然它可能是多餘的,但我爲此創建了一個類,例如,我想要進行幾次「一致性檢查」以確保指定了所有必需的信息。 – Jhonny

+0

「from src.config import Configuration」應該可以在config.py中創建Configuration類時使用。然而,我會建議將'src'重命名爲更多與項目相關的項目,我們只需再次使用項目名稱即可。它使您的導入更加明確,並最終減少歧義。我也建議你按照Nils Werner的指導原則創建一個setup.py。 https://docs.python.org/2/distutils/setupscript.html –

3

您可以通過在project-name創建setup.py文件打個包你的項目。之後,你可以做

pip install -e project-name/ 

和來自世界各地的在你的Python環境,然後你可以做

import project_name 
import project_name.library.config 

此外,如果你做

from __future__ import absolute_import 

你可以做import語句像

from ..library import config 

to es基本上導入../library/config.py

+0

這不符合我的項目結構,因爲它必須是'import src.library.config',不是嗎?不過,我明白你的觀點,謝謝。 – Jhonny

+0

[這取決於你放在你的'setup.py'中](https://setuptools.readthedocs.io/en/latest/setuptools.html)。 'src /'中的內容可能以'import project_name.src'或'import project_name'結尾。 –