나는 수입을 맨 위 선언으로 옮겨서 이미 나의 문제를 해결했다. 궁금한 점이있다. 의 대상이되는 함수에서 '__main__'
으로 가져온 모듈을 사용할 수없는 이유는 무엇입니까? 예를 들어왜 '__main__'모듈을 가져 오면 멀티 프로세스가 모듈을 사용할 수 없습니까?
:
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'은 메인 스크립트를 생성하는 각 파이썬 서브 프로세스로'import'합니다. 따라서'if __name__ == '__main __''은'False'가됩니다. 스크립트에서,'run()'이 실행될 때 모듈이'arcpy' 모듈을 가져 오지 않았 음을 의미합니다. 왜냐하면 프로세스가 완전히 다른 메모리 공간에서 실행되기 때문입니다. – martineau