추가 처리를 위해 사용자 정의 함수에 정보를로드하려고합니다. 입력 파일은 프로그래머가 아닌 사람에 의해 생성해야하기 때문에 나는 다음과 같은 형식을 선택했습니다 :execfile()을 사용하여 함수 변수 설정
는#contents of vessel_data.txt
hull_length = 100000.
hull_width = 50000.
etc.
내 함수는 execfile()
를 통해 입력 파일을로드합니다. 그런 다음 데이터를 배열로 그룹화하고이를 함수의 출력으로 전달하려고합니다. 대략과 같이 :
file_path = ..\vessel_name.txt
def my_input_func(file_path):
execfile(file_path)
data = np.array([[hull_length],
[hull_width ],
[etc. ]])
return(data)
나는 exec()
및 execfile()
를 통해 그 데이터를로드 눈살을 찌푸리게 알고 있지만, 입력은 비 프로그래머 명심 생성됩니다. 어쨌든, 나는 다음과 같은 오류 얻을 :이 줄을 추가 한 후
NameError: global name 'hull_length' is not defined
을, 나는 예상대로 내 변수는 local
이름 공간에로드되는 것을 확인할 수 있습니다
print 'Locals: ' + str([x for x in locals() if x[0] == 'h'])
print 'Globals: ' + str([x for x in globals() if x[0] == 'h'])
을 나 한테 무슨 퍼즐 것은 왜 내 기능입니다 변수를 정의하려고 할 때 global
이름 공간을 찾습니다. 필자는 명시 적으로 언급하지 않는 한 함수 내부의 모든 것이 함수의 로컬 인 이름 공간을 처리한다는 인상하에있었습니다. 나는 내 execfile()
명령을 수정하여 작동 할 수 있습니다 :
execfile(file_path, globals())
하지만 난 전역 이름 공간으로 모든로드에 관심이 아니다.
그렇다면 global
네임 스페이스에 모든 것을로드하지 않고이 작업을 수행하려면 어떻게해야합니까?
file_path = ..\vessel_name.txt
def my_input_func(file_path):
vessel_vars = {}
execfile(file_path, vessel_vars)
data = np.array([[vessel_vars['hull_length']],
[vessel_vars['hull_width'] ],
[vessel_vars['etc.'] ]])
return(data)
:
종류와 관련, 라스무스
======== 편집 =======는
이 나는 그것이 쿠엔틴의 답변에 따라 작동하게하는 방법이다
환호성 Quentin!
이것은 컴파일 타임에 컴파일러가 변수의 로컬 정의를 보지 못해서 로컬로드가 아닌 전역로드로 액세스를 컴파일한다는 사실 때문이라고 생각합니다. – Hyperboreus
[docs] (http://docs.python.org/2/library/functions.html#execfile)에서는 로컬 또는 글로벌 사전을 지정해야한다고 언급하지만 그렇지 않으면'execfile '이 반환되지 않습니다. – Greg