2016-11-07 64 views
0

我想在優化框架(https://brightwaylca.org/)內運行Brightway2。從其他程序運行brightway2模型

基本上,我想創建一個Python腳本,將輸入文件發送到外部模型(也是在Python中)並獲取輸出。然後腳本將活動數據寫入Brightway數據庫,然後運行Brightway2以獲得LCA分數。然後該分數將用於基於優化算法更新輸入文件。

Brightway2似乎是唯一合格的這種項目,但我遇到了麻煩實施。基本上,我想知道最簡單的方法是什麼。我有外部模型和優化算法。

到目前爲止,我已經爲我的Brightway2模型使用了Jupyter筆記本,但是當我將筆記本轉換爲python模塊並在IPython的Brightway2環境中運行筆記本時,我經常會遇到錯誤。模塊在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的:模塊' '沒有屬性'規格'

回答

0

您遇到的問題是multiprocessing doesn't work in the (i)python shell on Windows。筆記本通過魔法避免了這個問題。 Ecospold2DataExtractor默認使用多處理來加速提取許多Ecospold2文件。這應該是可選的;現在,您可以執行下列操作之一:

  1. 您應該只需要導入的ecoinvent 3.2次,所以這可能在A)筆記本來完成,或者b)您在調用一個單獨的Python腳本命令行。
  2. 使用編寫導入腳本然後導入該腳本的方法,而不是直接在python會話中導入(請參閱上面的SO鏈接以獲取更多詳細信息)。

在回答一些其他問題/疑慮:

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

號的任何一次遇到這種情況應報告as a bug

I was thinking of using PyAutoGUI to send inputs to the Brightway2 environment and IPython. Is there an easier/better way to do that?

圖形用戶界面很難 - 你可以寫一個!

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

沒有Brightway2 environment - 只是一組可導入的python包。您可以單獨導入它們(儘管一些相互依賴),例如bw2calc可以獨立運行。

+0

這很有道理。 我基本上遵循你的建議,製作了項目並導入了一次數據,然後使用腳本來運行它。

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

我還在編輯評論,並過了5分鐘的窗口。 我總是運行bw2-env.bat,它允許我導入brightway2,這是我無法做到的。 – Jim

+0

「圖形用戶界面很難 - 歡迎您寫下一個!」 哦,我不打算寫GUI。你可能會知道這不在我的技能範圍之內。我只是在運行bw2-env.bat後使用pyautogui發送文本來運行IPython和我的腳本。 謝謝你的幫助。 – Jim