2016-11-07 2 views
0

Ich möchte Brightway2 innerhalb eines Optimierungsrahmens (https://brightwaylca.org/) ausführen.Ausführen von Brightway2-Modellen aus anderen Programmen

Grundsätzlich möchte ich ein Python-Skript erstellen, das eine Eingabedatei an ein externes Modell (auch in Python) sendet und die Ausgaben abruft. Das Skript schreibt dann Aktivitätsdaten in eine Brightway-Datenbank und führt dann Brightway2 aus, um einen LCA-Score zu erhalten. Diese Bewertung wird dann verwendet, um die Eingabedatei basierend auf einem Optimierungsalgorithmus zu aktualisieren.

Brightway2 scheint für diese Art von Projekt eindeutig geeignet, aber ich habe Probleme bei der Implementierung. Im Grunde wollte ich wissen, was der einfachste Weg war, dies zu tun. Ich habe das externe Modell und die Optimierungsalgorithmen.

Bis jetzt habe ich Jupyter Notebooks für meine Brightway2 Modelle verwendet, aber ich bekomme oft Fehler wenn ich die Notebooks in Python Module umwandle und sie in der Brightway2 Umgebung in IPython laufe. Gibt es einen Grund, warum die Module in IPython anders laufen sollten als in Jupyter Notebooks?

Ich dachte daran, PyAutoGUI zu verwenden, um Eingaben an die Brightway2-Umgebung und IPython zu senden. Gibt es einen leichteren/besseren Weg das zu tun?

Gibt es eine Möglichkeit, die erforderlichen Brightway-Module zu importieren, ohne in der Brightway2-Umgebung ausgeführt zu werden?

Dank

Hier ist ein Beispiel für einen Fehler, den ich mit IPython, aber nicht mit Jupyter Noten. Wenn ich den folgenden Code in Jupyter Notizen ausführen, läuft es gut.

from brightway2 import * 

def main(): 
    project_name = "Algae_LCA" 
    projects.set_current(project_name) 
    bw2setup() 
    methods.load() 

    #Set directory for Ecoinvent v3.2 datasets and name the database. 
    data_directory = "E:\GOOGLE~1\ECOINV~1\ECOINV~1.2-C\datasets" 
    database_name = "Ecoinvent_v3.2-Conseq" 


    #Import the database, apply cleaning strategies, and provide statistics 
    ei = SingleOutputEcospold2Importer(data_directory, database_name) 
    ei.apply_strategies() 
    ei.statistics() 

Aber wenn ich es in IPython im bw2-Umgebung ausführen, es auflegt/abgestürzt auf

ei = SingleOutputEcospold2Importer(data_directory, database_name) 

Es gibt mir die folgende Fehlermeldung:

------------------------------------------------------------- 
AttributeError       Traceback (most rec 
C:\bw2-python\Algae LCA\BW2_Project_Database_Setup_Test.py in 
36 
37 if __name__ == "__main__": 
---> 38  main() 
39 

C:\bw2-python\Algae LCA\BW2_Project_Database_Setup_Test.py in 
25  #Import the database, apply cleaning strategies, 
26 
---> 27 ei = SingleOutputEcospold2Importer(data_directory 
28  #ei.apply_strategies() 
29  #ei.statistics() 

C:\bw2-python\envs\bw2\lib\site-packages\bw2io\importers\ecos 
47 
48   start = time() 
---> 49 self.data = Ecospold2DataExtractor.extract(di 
50   print(u"Extracted {} datasets in {:.2f} secon 
51    len(self.data), time() - start)) 

C:\bw2-python\envs\bw2\lib\site-packages\bw2io\extractors\eco 
77 
78   if use_mp: 
---> 79   with multiprocessing.Pool(processes=multi 
80     print("Extracting XML data from {} da 
81     results = [ 

C:\bw2-python\envs\bw2\lib\multiprocessing\context.py in Pool 
116   from .pool import Pool 
117   return Pool(processes, initializer, initargs, 
--> 118    context=self.get_context()) 
119 
120  def RawValue(self, typecode_or_type, *args): 

C:\bw2-python\envs\bw2\lib\multiprocessing\pool.py in __init_ 
166   self._processes = processes 
167   self._pool = [] 
--> 168  self._repopulate_pool() 
169 
170   self._worker_handler = threading.Thread(

C:\bw2-python\envs\bw2\lib\multiprocessing\pool.py in _repopu 
231    w.name = w.name.replace('Process', 'PoolW 
232    w.daemon = True 
--> 233   w.start() 
234    util.debug('added worker') 
235 

C:\bw2-python\envs\bw2\lib\multiprocessing\process.py in star 
103    'daemonic processes are not allowed to 
104   _cleanup() 
--> 105  self._popen = self._Popen(self) 
106   self._sentinel = self._popen.sentinel 
107   _children.add(self) 

C:\bw2-python\envs\bw2\lib\multiprocessing\context.py in _Pop 
311   def _Popen(process_obj): 
312    from .popen_spawn_win32 import Popen 
--> 313   return Popen(process_obj) 
314 
315  class SpawnContext(BaseContext): 

C:\bw2-python\envs\bw2\lib\multiprocessing\popen_spawn_win32. 
32 
33  def __init__(self, process_obj): 
---> 34 prep_data = spawn.get_preparation_data(proces 
35 
36   # read end of pipe will be "stolen" by the ch 

C:\bw2-python\envs\bw2\lib\multiprocessing\spawn.py in get_pr 
171  # or through direct execution (or to leave it alo 
172  main_module = sys.modules['__main__'] 
--> 173 main_mod_name = getattr(main_module.__spec__, "na 
174  if main_mod_name is not None: 
175   d['init_main_from_name'] = main_mod_name 

Attribute: Modul ' Haupt 'hat keine Eigenschaft' Spezifikation '

Antwort

0

Das Problem, auf das Sie stoßen, ist multiprocessing doesn't work in the (i)python shell on Windows. Das Notebook vermeidet dieses Problem durch Magie. Die Ecospold2DataExtractor verwendet standardmäßig Multiprocessing, um die Extraktion vieler Ecospold2-Dateien zu beschleunigen. Dies sollte wahrscheinlich optional gemacht werden; denn jetzt können Sie eine der folgenden Aktionen ausführen:

  1. Sie nur 3,2 ecoinvent sollten einmal importieren müssen, so könnte dies in a) einen Notebook, oder b) ein separater Python-Skript, das Sie auf dem Aufrufen getan werden Befehlszeile.
  2. Verwenden Sie den Hack ein Importskript zu schreiben und dann importieren, anstatt im Import direkt in der Python-Sitzung zu tun (siehe SO Verknüpfung oben für weitere Details).

In Reaktion auf einige andere Fragen/Interessen:

Is there a reason the modules should run differently in IPython than in Jupyter Notebooks?

Nr dies Jedes Mal sollte as a bug gemeldet werden passiert.

GUIs sind schwer - Sie können gerne eine schreiben!

Is there a way to import the necessary Brightway modules without running in the Brightway2 environment?

Es gibt keine Brightway2 environment - nur eine Reihe von Python-Pakete, die importiert werden können. Sie können sie separat importieren (obwohl einige voneinander abhängen), z. bw2calc kann unabhängig von allem anderen ausgeführt werden.

+0

Das macht Sinn. Ich folgte im Wesentlichen Ihrem Vorschlag und machte das Projekt und importierte die Daten einmal, und dann verwendete Skripte, um es auszuführen.

There is no Brightway2 environment - just a set of python packages that can be imported. You can import them separately (though some depend on each other), e.g. bw2calc can be run independent of everything else.
Jim

+0

Ich war noch am Bearbeiten des Kommentars und ging über das 5-Minuten-Fenster. Ich lasse immer die bw2-env.bat laufen, die mir erlaubt, brightway2 zu importieren, was ich sonst nicht tun kann. – Jim

+0

"GUIs sind schwer - Sie können gerne eine schreiben!" Oh, ich bin nicht im Begriff, eine GUI zu schreiben. Sie können wahrscheinlich sagen, dass dies außerhalb meiner Fähigkeiten ist. Ich benutze nur pyautogui, um Text zu senden, um IPython und meine Skripte auszuführen, nachdem bw2-env.bat ausgeführt wurde. Danke für Ihre Hilfe. – Jim

Verwandte Themen