Wie greife ich von den anderen Modulen auf die Attribute des aktuellen Ausführungsmoduls zu?

Ich habe mehrere "app'-Module (die von einer Hauptanwendung gestartet werden) und ein Utility-Modul mit einiger Funktionalität:

my_utility/ ├── __init__.py └── __main__.py apps/ ├── app1/ │ ├── __init__.py │ └── __main__.py ├── app2/ │ ├── __init__.py │ └── __main__.py ... main_app.py 

Die apps werden so gestartet (durch die Hauptanwendung):

 python3 -m <app-name> 

Ich brauche einige Meta-Informationen (gebunden an das Modul) über jede App, die von der main_app und den Apps selbst main_app werden kann:

Apps / app1 / __ init__.py :

 meta_info = {'min_platform_version': '1.0', 'logger_name': 'mm1'} 

… und benutze es so:

Apps / app1 / __ main__.py :

 from my_utility import handle_meta_info # does something with meta_info (checking, etc.) handle_meta_info() 

Main_app.py :

 mod = importlib.import_module('app1') meta_inf = getattr(mod, 'meta_info') do_something(meta_inf) 

Das Problem

Ich weiß nicht, wie man in den Apps auf meta_info zugreifen meta_info . Ich weiß, ich kann das Modul selbst import und auf meta_info zugreifen:

Apps / app1 / __ main__.py :

 import app1 do_something(app1.meta_info) 

Aber das ist nur möglich, wenn ich den Namen des Moduls kenne. Von innen ein anderes Modul – zB my_utility Ich weiß nicht, wie man auf das Modul my_utility das an erster Stelle gestartet wurde (oder sein Name).

My_utility / __ main__.py :

 def handle_meta_info(): import MAIN_MODULE <-- don't know, what to import here do_something(MAIN_MODULE.meta_info) 

Mit anderen Worten

Ich weiß nicht, wie man innerhalb eines App-Prozesses auf meta_info zugreifen kann (wird über python3 -m <name> gestartet, aber von einem anderen Modul, das den Namen des ' python3 -m <name> Moduls nicht kennt, das gestartet wurde

Ansätze

  • Geben Sie immer den Modulnamen an, wenn Sie Meta-Info-Funktionen anrufen (schlecht, weil es ausführlich und redundant ist)

     from my_utility import handle_meta_info handle_meta_info('app1') 
  • meta_info zu __builtins__ (allgemein schlecht, um globalen Raum zu verschmutzen)

  • Parse die Kommandozeile (hässlich)

  • Analysiere den import my_utility beim import my_utility (gefährlich, hässlich)

Die Lösung würde ich gerne sehen

Es wäre schön, in der Lage sein, entweder auf die "wichtigsten" Module globalen Raum zugreifen ODER wissen, dass es Name (zu importieren)

My_utility / __ main__.py :

 def handle_meta_info(): do_something(__main_module__.meta_info) 

ODER

 def handle_meta_info(): if process_has_been_started_as_module(): mod = importlib.import_module(name_of_main_module()) meta_inf = getattr(mod, 'meta_info') do_something(meta_inf) 

Irgendwelche Ideen?

Meine aktuelle (blutige) Lösung:

Inside my_utility Ich benutze psutil , um die Kommandozeile der Modul wurde mit (warum nicht sys.argv weil ). Dort entnehme ich den Modulnamen. Auf diese Weise my_utility ich die gewünschte Metainformation an my_utility (also muss ich sie nur einmal laden).

My_utility / __ init__.py :

 def __get_executed_modules_meta_info__() -> dict: def get_executed_module_name() from psutil import Process from os import getpid _cmdline = Process(getpid()).cmdline try: # normal case: app has been started via 'python3 -m <app>' return _cmdline[_cmdline.index('-m') + 1] except ValueError: return None from importlib import import_module try: _main_module = import_module(get_module_name()) return import_module(get_executed_module_name()).meta_info except AttributeError: return {} __executed_modules_meta_info__ = __get_executed_modules_meta_info__() 

  • Python-Paket installiert aber konnte nicht importieren
  • Gib eine Liste der importierten Python-Module zurück, die in einem Skript verwendet werden?
  • Abfangen von Modulaufrufen?
  • Welches Python-Modul eignet sich für die Datenmanipulation in einer Liste?
  • PyCharm-Fehler: 'Kein Modul' beim Versuch, eigenes Modul zu importieren (Python-Skript)
  • Überprüfen Sie, ob das Modul vorhanden ist, wenn es nicht in Python installiert ist
  • Python-Modulabhängigkeit
  • Installiere gmpy auf Mac OS X Mountain Lion
  • Python kann das installierte Modul `news` nicht sehen
  • Wie man das Python-Modul neu lädt, das mit `from module import *` importiert wurde
  • Gibt es irgendwelche Python Bluetooth Module für Windows 7 64 bit?
  • Python ist die beste Programmiersprache der Welt.