Запуск моделей 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. Это, вероятно, следует сделать необязательным; на данный момент вы можете сделать одно из следующих действий:
- Вам нужно только один раз импортировать ecoinvent 3.2, так что это можно сделать в а) записной книжке или б) в отдельном скрипте python, который вы вызываете в командной строке.
- Используйте способ написания сценария импорта, а затем импортируйте его, вместо того, чтобы выполнять импорт непосредственно в сеансе Python (см. Ссылку на SO выше для более подробной информации).
В ответ на некоторые другие вопросы / проблемы:
Есть ли причина, по которой модули должны работать по-другому в IPython, чем в ноутбуках Jupyter?
Нет. Каждый раз, когда это происходит, следует сообщать об ошибке.
Я думал об использовании PyAutoGUI для отправки входных данных в среду Brightway2 и IPython. Есть ли более простой / лучший способ сделать это?
Графический интерфейс сложен - вы можете написать один!
Есть ли способ импортировать необходимые модули Brightway без запуска в среде Brightway2?
Здесь нет Brightway2 environment
- просто набор пакетов Python, которые могут быть импортированы. Вы можете импортировать их отдельно (хотя некоторые зависят друг от друга), например bw2calc
может быть запущен независимо от всего остального.