Project

General

Profile

機能 #4498

モジュール探索時に、指定したパス以下のディレクトリに存在するファイルを探索するようにする

Added by n-miyamoto almost 4 years ago. Updated over 3 years ago.

Status:
終了
Priority:
通常
Assignee:
Target version:
-
Start date:
03/26/2018
Due date:
% Done:

100%

Estimated time:

Description

manager.modules.load_pathを以下のように指定した場合、Components以下のファイルを全て調べるようにする。

manager.modules.load_path: C:\\Program Files (x86)\\OpenRTM-aist\\1.2.0\\Components\\

History

#1 Updated by n-miyamoto almost 4 years ago

  • Status changed from 担当 to 解決
  • % Done changed from 0 to 100

StringUtil.pyに新たにgetFileList関数とfindFile関数を定義した。

findFile関数は指定ディレクトリ(dir)から、指定ファイル名(filename)と名前が一致するファイルパスを全て取得し、リスト(filelist)に格納する。

def findFile(dir, filename, filelist):
    dirs = glob.glob(os.path.join(dir,"*"))
    for d in dirs:
        if os.path.isdir(d):
            findFile(d, filename, filelist)
    files = glob.glob(os.path.join(dir,filename))
    for f in files:
        if os.path.isfile(d):
            filelist.append(f)

getFileList関数は指定ディレクトリ(dir)から指定拡張子(ext)のファイルパスを全て取得し、リスト(filelist)に格納する。

def getFileList(dir, ext, filelist):
    dirs = glob.glob(os.path.join(dir,"*"))
    for d in dirs:
        if os.path.isdir(d):
            getFileList(d, ext, filelist)
    files = glob.glob(os.path.join(dir,"*."+ext))
    for f in files:
        if os.path.isfile(d):
            filelist.append(f)

ModuleManagerのgetModuleList関数でロード可能なモジュール一覧を取得する際は、getFileList関数により指定拡張子に一致する全てのファイルパスを取得する。

    for path in paths:
      if not path:
        self._rtcout.RTC_WARN("Given load path is empty")
        continue
      self._rtcout.RTC_DEBUG("Module load path: %s", path)
      flist = []
      for suffix in suffixes:
        tmp = [suffix]
        OpenRTM_aist.eraseHeadBlank(tmp)
        suffix = tmp[0]

        tmp = []
        OpenRTM_aist.getFileList(path,suffix,tmp)

        self._rtcout.RTC_DEBUG("File list (path:%s, ext:%s): %s", (path,suffix,OpenRTM_aist.flatten(suffixes)))
        flist.extend(tmp)

ModuleManagerのfindFile関数でモジュールの検索をする際は、指定ディレクトリ直下にファイルが存在するかを確認した後、下の階層のディレクトリを探索する。

  def findFile(self, fname, load_path):
    file_name = fname
    for path in load_path:
      suffix = self._properties.getProperty("manager.modules.Python.suffixes")
      if fname.find("."+suffix) == -1:
        f = str(path) + os.sep + str(file_name)+"."+suffix
      else:
        f = str(path)+ os.sep + str(file_name)
      if self.fileExist(f):
        f = f.replace("\\","/")
        f = f.replace("//","/")
        return f
      filelist = []
      OpenRTM_aist.findFile(path,file_name,filelist)

      if len(filelist) > 0:
        return filelist[0]
    return "" 

#2 Updated by n-miyamoto over 3 years ago

  • Status changed from 解決 to 終了

Also available in: Atom PDF