我已經通過將導入移動到頂部聲明來解決了我的問題,但它讓我想知道:爲什麼我不能使用在'__main__'
中導入的模塊作爲multiprocessing
的目標函數?爲什麼'__main__'中的導入模塊不允許multiprocessig使用模塊?
例如:
import os
import multiprocessing as mp
def run(in_file, out_dir, out_q):
arcpy.RaterToPolygon_conversion(in_file, out_dir, "NO_SIMPIFY", "Value")
status = str("Done with "+os.path.basename(in_file))
out_q.put(status, block=False)
if __name__ == '__main__':
raw_input("Program may hang, press Enter to import ArcPy...")
import arcpy
q = mp.Queue()
_file = path/to/file
_dir = path/to/dir
# There are actually lots of files in a loop to build
# processes but I just do one for context here
p = mp.Process(target=run, args=(_file, _dir, q))
p.start()
# I do stuff with Queue below to status user
當你運行這個在IDLE不會錯誤在所有...只是一直在做一個Queue
檢查(這是個好所以沒有問題)。問題是,當你在CMD終端(無論是OS還是Python)中運行它時,會產生arcpy
未定義的錯誤!
只是一個好奇的話題。
你在linux或windows上運行嗎? – tdelaney
@tdelaney Windows,這就是爲什麼我使用'if __name__'語句。 –
在WIndows中,'multiprocessing'有效''將主腳本導入到它生成的每個Python子進程中,所以'if __name__ =='__main __''在這些情況下將是'False'。在你的腳本中,這意味着當'run()'被執行時,模塊'arcpy'不會被導入,因爲它所處理的進程在完全獨立的內存空間中執行。 – martineau