2016-05-31 180 views
0

我正在編寫一個python包管理器,並且我正在根據當前目錄中的程序/包生成__all__對象,但我也想忽略任何非包。 即,如果我有以下目錄結構:獲取當前目錄中的所有文件和目錄python

project 
|------__init__.py 
|------prog1.py 
|------package 
    |------__init__.py 
    |------prog2.py 
|------resources 
    |------ping.png 

我想__all__變量如下所示:

__all__ = ['prog1', 'package'] 

我曾嘗試過各種東西,但在所有誠實,我不知道我在做什麼。

這是我最後一次嘗試:

import os 
from os import path 


def config_all(directory): 
    __all__ = [] 
    directory = path.abspath(directory) 
    for root, dirs, files in os.walk(directory, topdown=False): 
     for d in dirs: 
      os.chdir("/czar/".join(path.abspath(d).rsplit("/", 1))) 
      v = list(os.walk('.'))[0][2] 
      if "__init__.py" in v: 
       __all__.append(d) 
      for i in v: 
       while i in __all__: 
        __all__.remove(i) 
      os.chdir('..') 
     for f in files: 
      __all__.append(path.join(root, f).rsplit("/", 1)[1].rsplit(".", 1)[0]) 
    return __all__ 

__all__ = config_all('czar/') 
print(__all__) 
+1

請出示你已經嘗試過了,你已經閱讀過哪些文檔。 –

+0

@BryanOakley我沒有展示我已經嘗試過的東西,因爲它沒有像我想要的那樣工作,我不希望這篇文章的回覆是切題。 – mcchucklezz

+2

不要這樣做:不要使'__all__'動態。只需*顯式*指定要從模塊中導出哪些函數和變量。 – Evert

回答

1

你希望所有的.py,文件和目錄都用一個__init__.py文件指定的目錄,使用glob

def config_all(directory): 
    result = [] 
    for filename in glob.iglob(os.path.join(directory, '*', '__init__.py')): 
     result.append(os.path.basename(os.path.dirname(filename)) 
    for filename in glob.iglob(os.path.join(directory, '*.py'): 
     result.append(os.path.splitext(os.path.basename(filename))[0]) 
    return result 
相關問題