2017-06-12 104 views
1

有一個高度高效的StackOverflow thread,它說在另一個Python文件中運行Python文件的最佳方式是將它們作爲模塊使用import以編程方式將Python文件作爲另一個Python文件中的模塊導入並運行它們

這對我來說很好,除非我在編程運行時至少有數百個(如果不是數千個)文件需要運行時遇到問題。

所有的文件都在同一個目錄中,並且共享一個通用的命名約定。我試圖像這樣運行它們:

import glob, os 

for filename in glob.glob("*_decomp*"): 
    import filename 

而是拋出一個錯誤:

Traceback (most recent call last): 
    File "C:\Python35\lib\site-packages\IPython\core\interactiveshell.py", line 

3066, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "", line 4, in import filename File "C:\Program Files\JetBrains\PyCharm Community Edition 2017.1.3\helpers\pydev_pydev_bundle\pydev_import_hook.py", line 21, in do_import module = self._system_import(name, *args, **kwargs) ImportError: No module named 'filename'

變量filename也強調了紅色的IDE,它否定了我原來的假設,這是一個簡單的需要刪除.py文件擴展名的問題。

這工作正常進行打印:

import glob, os 

for filename in glob.glob("*_decomp*"): 
    # import filename 
    print(filename) 

所以,我真的不知道與早些時候的發言是什麼問題或如何解決它。我也可以手動執行import並且工作正常,但我希望以編程方式執行此操作,以便我不必鍵入所有文件名,並且因爲文件名會隨時間而改變。

最後,我也[:-3](即filename[:-3])試了一下刪除文件擴展名,但同樣只適用於print(),而不是import

回答

2

舉例來說,還有其他的導入方式沒有被你所提供的SO鏈接所覆蓋(儘管我並不認爲這是一種正規或甚至是一種好的導入方式,但它對我來說很有用)我通過這個問題找到的例子Building a minimal plugin architecture in Python我在下面寫了一個簡單的插件實現 - 它在下面的文件夾中搜索名爲'plugins'的文件夾。每個插件必須實現一個名爲Plugin的類,它們都獲得相同的參數。

path = 'plugins' 
# find subdirs of the path - these are the groups 
# for each group, load all the .py files, each provides one or more actions 
searchdir = os.path.join(os.path.split(__file__)[0],path) 
if os.access(searchdir, os.F_OK): 
    print "searchdir=",searchdir 
    print "results=",os.walk(searchdir) 
    (root, dirs, files) =os.walk(searchdir).next() 
    print root,dirs,files 
    for dir in dirs: 
     print "scanning dir",dir 
     self.groups[dir] = [] 
     sys.path.insert(0, os.path.join(root,dir)) 
     for f in sorted(os.listdir(os.path.join(root,dir))): 
      print "looking at",f 
      fname, ext = os.path.splitext(f) 
      if ext == '.py': 
       print "importing ",f 
       mod = __import__(fname) 
       try: 
        self.groups[dir].append(mod.PlugIn(group,cmdobj,config, jts_data, directives, current_config_props,allcomponents,globals)) 
       except: 
        print "URGH! plugin instantiation error!" 
        raise 
     sys.path.pop(0) 
else: 
    print "############# no plugins folder",searchdir 
相關問題