Запуск моделей brightway2 из других программ

Я хочу запустить Brightway2 в рамках оптимизации ( https://brightwaylca.org/).

По сути, я хочу создать скрипт Python, который отправляет входной файл во внешнюю модель (также в Python) и получает выходные данные. Затем сценарий запишет данные об активности в базу данных Brightway, а затем запустит Brightway2, чтобы получить оценку LCA. Затем эта оценка будет использоваться для обновления входного файла на основе алгоритма оптимизации.

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

До сих пор я использовал ноутбуки Jupyter для своих моделей Brightway2, но я часто получаю ошибки, когда я конвертирую ноутбуки в модули Python и запускаю их в среде Brightway2 в IPython. Есть ли причина, по которой модули должны работать по-другому в IPython, чем в ноутбуках Jupyter?

Я думал об использовании PyAutoGUI для отправки входных данных в среду Brightway2 и IPython. Есть ли более простой / лучший способ сделать это?

Есть ли способ импортировать необходимые модули Brightway без запуска в среде Brightway2?

Спасибо

Вот пример ошибки, которую я получаю с IPython, но не с заметками Jupyter. Когда я запускаю следующий код в заметках Jupyter, он работает нормально.

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()

Но если я запускаю его в IPython в среде bw2, он зависает / падает на

 ei = SingleOutputEcospold2Importer(data_directory, database_name)

Это дает мне следующую ошибку:

-------------------------------------------------------------
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

AttributeError: модуль 'main' не имеет атрибута 'spec'

1 ответ

Решение

Проблема, с которой вы сталкиваетесь, заключается в том, что многопроцессорная обработка не работает в оболочке (i) python в Windows. Ноутбук устраняет эту проблему благодаря магии. Ecospold2DataExtractor по умолчанию используется многопроцессорная обработка для ускорения извлечения многих файлов Ecospold2. Это, вероятно, следует сделать необязательным; на данный момент вы можете сделать одно из следующих действий:

  1. Вам нужно только один раз импортировать ecoinvent 3.2, так что это можно сделать в а) записной книжке или б) в отдельном скрипте python, который вы вызываете в командной строке.
  2. Используйте способ написания сценария импорта, а затем импортируйте его, вместо того, чтобы выполнять импорт непосредственно в сеансе Python (см. Ссылку на SO выше для более подробной информации).

В ответ на некоторые другие вопросы / проблемы:

Есть ли причина, по которой модули должны работать по-другому в IPython, чем в ноутбуках Jupyter?

Нет. Каждый раз, когда это происходит, следует сообщать об ошибке.

Я думал об использовании PyAutoGUI для отправки входных данных в среду Brightway2 и IPython. Есть ли более простой / лучший способ сделать это?

Графический интерфейс сложен - вы можете написать один!

Есть ли способ импортировать необходимые модули Brightway без запуска в среде Brightway2?

Здесь нет Brightway2 environment - просто набор пакетов Python, которые могут быть импортированы. Вы можете импортировать их отдельно (хотя некоторые зависят друг от друга), например bw2calc может быть запущен независимо от всего остального.

Другие вопросы по тегам