2016-11-24 8 views
0

Я уже знаю, что программа питон может определить его имя файла, самый простой, что я видел это существоМожет ли модуль python определить его имя файла или что он был импортирован как?

import sys 
name = sys.argv[0] 

Мой вопрос может код в импортируемого модуля делать то же рода вещи? Я использую python 3.5.

Я пишу большую программу, которая для удобства и расширяемости разделяется на главный раздел и «надстройки», а скорее на Audacity. Я пытаюсь упростить его расширение и СУХОЙ, в результате чего добавочный модуль просто добавляется в каталог программы, и основная программа может его поднять и использовать. Я использую стандарт именования, где имена файлов модулей имеют префикс для конкретной программы, чтобы идентифицировать их, а затем внедрять некоторые классы и данные, называемые стандартными именами.

Поскольку основная программа не знает имена дополнений раньше времени, я их импорта, как это, который, кажется, работает нормально

def get_available_modules(self, prefix=""): 
    """ import the files named prefix_xxx.py in this folder """ 

    files = os.listdir(os.getcwd()) 
    self.modules = {} 

    for file_name in files: 
     # print('examining ', file_name) 
     if file_name.startswith(prefix): 
      # print('this one looks OK ', file_name) 
      # strip the .py off the end 
      mod_name = file_name[:-3] 
      # strip prefix off the front 
      mod_ID = mod_name[len(prefix):] 

      self.modules[mod_ID] = __import__(mod_name) 

    # print('loaded modules ') 
    # for name in self.modules: 
     # print(name) 

Попав модули, я могу затем получить доступ к тому, что они делают, поместить свои описания в списокBoxes или меню, создать экземпляр и показать свои панели управления и указать им ресурсы, на которых они должны работать. Однако для отладки самосогласованности я хотел бы, чтобы модуль мог определить, что он назвал, каково его имя. Я буду создавать новые функции, редактируя предыдущие, и знаю, что я не буду менять все последовательно.

Очевидно, что при запуске объектов, я могу также передать mod_ID, но это скорее похоже на то, что фокусник помещает кролика в шляпу.

Если в модуле есть какой-либо параметр, который делает его имя файла доступным для себя?

+0

не пробовал это сам, но похоже, что это может сработать: __ loader __. Fullname см. Https://www.python.org/dev/peps/pep-0302/и http://stackoverflow.com/questions/5183601 –

+0

Возможный дубликат [Python \ _ \ _ файл \ _ \ _ атрибута абсолютный или относительный?] (http://stackoverflow.com/questions/7116889/ python-file-attribute-absolute-or-relative) – user590028

+0

Um, dunder name dunder ____name____ работает. Я уверен, что это возможно для R в TFM где-то! ____loader____, похоже, не имеет .fullname, по крайней мере, не на моем 3.5. –

ответ

0

(Отправлено от имени ОП).

Duh! Это ____name____ (это имя dunder, dunder, настоящие dunder messes с форматированием!