2008-11-13 20 views
6

我有相當數量的Python腳本包含可供其他Python腳本使用和引用的可重用代碼。但是,這些腳本往往分散在不同的目錄中,我發現在頂級腳本中必須包含(通常是多次)對sys.path.append的調用會有點繁瑣。我只想在相同腳本中提供沒有額外文件引用的'import'語句。在Python中,如何有效管理腳本文件之間的引用?

目前,我有這樣的:

import sys 
sys.path.append('..//shared1//reusable_foo') 
import Foo 
sys.path.append('..//shared2//reusable_bar') 
import Bar 

我更傾向於將如下:

import Foo 
import Bar 

我的背景主要是在.NET平臺上,所以我習慣了有元文件如* .csproj,* .vbproj,* .sln等來管理和包含源文件之外的實際文件路徑引用。這允許我只提供'using'指令(相當於Python的導入),而不公開所有引用,並允許跨多個腳本自行重用路徑引用。

Python是否對此有相應的支持,如果沒有,有哪些技術和方法?

回答

3

如果您的可重複使用的文件被打包(即,它們包括__init__.py文件)和路徑,包是您的PYTHONPATH或sys.path中的一部分,那麼你應該能夠做到這

import Foo 

This question提供了一些更多的細節。

(注:正如吉姆說,你也可以放下你的可重用的代碼到你的site-packages目錄。)

1

您可以將可重複使用的東西在site-packages。這是完全透明的,因爲它默認在sys.path

您可以將someName.pth文件放入site-packages。這些文件具有您的實際可重用內容所在的目錄。這也是完全透明的。並且不涉及在site-packages中安裝更改的額外步驟。

你可以把可重複使用的東西的目錄放在PYTHONPATH上。這有點不那麼透明,因爲你必須確定它已經設置好了。不是火箭科學,但不完全透明。

1

在一個項目中,我想確保用戶可以在任何地方放入python腳本(基本上可以用作插件)。我的解決辦法是把在該項目中的配置文件如下:

[server] 
PYPATH_APPEND: /home/jason:/usr/share/some_directory 

這樣的話,這將在程序啓動添加/家庭/傑森和/ usr /共享/ some_directory到Python路徑。

然後,這只是一個簡單的問題,用冒號拆分字符串,並將這些目錄添加到sys.path的末尾。您可能需要考慮在site-packages目錄中放置一個模塊,該目錄包含一個讀取該配置文件的函數,並將這些目錄添加到sys.path(不幸的是,我現在沒有時間編寫示例) 。

正如其他人所提到的,儘可能多地在網站包中使用並使用.pth文件是個好主意。但是,如果您有一個腳本需要導入一些不在站點包中的東西,而您不想從其他腳本導入,那麼這可能是一個好主意。

(也可能有辦法做到這一點使用.pth文件,但我喜歡能夠操控在同一個地方蟒蛇路徑,我把我的配置信息的其餘部分)

1

的最簡單方法是設置(或添加)PYTHONPATH,並將你的模塊和包放入(或符號鏈接)到PYTHONPATH中包含的路徑中。

0

我的解決辦法是打包一個實用工具,將導入模塊: my_util在現場包

import my_util 

foo = myutil.import_script('..//shared1//reusable_foo') 
if foo == None: 
    sys.exit(1) 


def import_script(script_path, log_status = True): 
    """ 
    imports a module and returns the handle 
    """ 
    lpath = os.path.split(script_path) 

    if lpath[1] == '': 
     log('Error in script "%s" in import_script' % (script_path)) 
     return None 


    #check if path is already in sys.path so we don't repeat 
    npath = None 
    if lpath[0] == '': 
     npath = '.' 
    else: 
     if lpath[0] not in sys.path: 
      npath = lpath[0] 

    if npath != None: 
     try: 
      sys.path.append(npath) 
     except: 
      if log_status == True: 
       log('Error adding path "%s" in import_script' % npath) 
      return None 

    try: 
     mod = __import__(lpath[1]) 
    except: 
     error_trace,error_reason = FormatExceptionInfo() 
     if log_status == True: 
      log('Error importing "%s" module in import_script: %s' % (script_path, error_trace + error_reason)) 
     sys.path.remove(npath) 
     return None 

    return mod 
相關問題