簡體   English   中英

從遠端目錄導入Python模塊

[英]Importing Python modules from a distant directory

從相對的相對目錄中導入模塊的最短方法是什么?

我們一直在使用此代碼,除了您當前的工作目錄必須與此代碼所在的目錄相同或相對路徑中斷之外,這還算不錯,這可能容易出錯並且會使用戶感到困惑。

import sys
sys.path.append('../../../Path/To/Shared/Code')

這段代碼(我認為)可以解決該問題,但要輸入的內容還很多。

import os,sys
sys.path.append(os.path.realpath(os.path.join(os.path.dirname(__file__), '../../../Path/To/Shared/Code')))

有沒有更短的方法來附加絕對路徑? 簡短很重要,因為這將必須在我們的許多文件中鍵入/出現。 (我們無法將其排除在外,因為那樣的話它將存在於共享代碼中,而我們無法實現它。雞肉和雞蛋,自舉等)

加上令我困擾的是,我們一直盲目地追加到sys.path,但這將是更多的代碼。 我當然希望標准庫中的某些內容可以對此有所幫助。

這通常會顯示在通過命令行運行的腳本文件中。 我們正在運行Python 2.6.2。

編輯:之所以使用相對路徑,是因為我們通常在計算機上擁有多個獨立的代碼庫副本。 重要的是,每個代碼庫副本都使用其自己的共享代碼副本。 因此,僅支持單個代碼庫的任何解決方案(例如,“將其放入站點包中”)都將對我們不起作用。

有什么建議么? 謝謝!

由於您不想將其安裝在站點程序包中,因此應使用buildoutvirtualenv創建隔離的開發環境。 這就解決了問題,並且意味着您不必再擺弄sys.path(事實上,因為Buildout確實為您完成了此工作)。

您已經在評論中解釋了為什么您不想安裝“單個site-packages目錄”,但是將site-packages放入一個很小的模塊 (例如jebootstrap.py

import os, sys

def relative_dir(apath):
  return os.path.realpath(
      os.path.join(os.path.dirname(apath),
      '../../../Path/To/Shared/Code'))

def addpack(apath):
  relative = relative_dir(apath)
  if relative not in sys.path:
    sys.path.append(relative)

現在,在代碼中的任何地方都可以擁有

import jebootstrap
jebootsrap.addpack(__file__)

其余所有共享代碼庫可以保持獨立的每次安裝。

有什么理由不想在站點包下創建自己的共享代碼目錄? 然后您可以導入import import shared.code.module ...

您有幾種處理導入的方法,所有方法都記錄在Python語言手冊中。

請參閱http://docs.python.org/library/site.htmlhttp://docs.python.org/reference/simple_stmts.html#the-import-statement

  1. 將其放在站點包中,並具有多個Python安裝。 您可以使用普通的PATH環境變量來選擇安裝。

  2. 將目錄放在您的PYTHONPATH環境變量中。 這是每個人的設置,因此您可以通過這種方式設法擁有多個版本的代碼庫。

  3. 將目錄放在站點包中的.pth文件中。 您可以使用普通的PATH環境變量來選擇安裝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM