문제

기본 구성 파일을로드 한 다음 사용자가 자신의 파이썬 파일을 추가 보충 구성 또는 기본값의 재정으로 제공 할 수있는 코드가 있습니다.

# foo.py

def load(cfg_path=None):
    # load default configuration
    exec(default_config)

    # load user-specific configuration
    if cfg_path:
        execfile(cfg_path)

그래도 문제가 있습니다. execfile() 다음으로 지정된 파일에서 지시문을 실행합니다 cfg_path 마치 작업 디렉토리에있는 것처럼 foo.py, 자체 작업 디렉토리가 아닙니다. 따라서, import 지침이 실패 할 수 있습니다 cfg_path 파일은 from m import x 어디 m 동일한 디렉토리의 모듈입니다 cfg_path.

내가 어떻게 할 execfile() 논쟁의 작업 디렉토리에서 또는 다른 결과를 달성합니까? 또한, 나는 그렇게 들었습니다 execfile Python 3에서는 더 이상 사용되지 않으며 사용해야합니다. exec, 그래서 내가 이것을해야 할 더 좋은 방법이 있다면, 나는 모두 귀입니다.

메모: 작업 디렉토리를 단순히 변경하는 솔루션이 정확하다고 생각하지 않습니다. 이 모듈을 내가 알 수있는 한 해당 모듈을 통역자의 모듈 검사 경로에 놓지 않을 것입니다.

도움이 되었습니까?

해결책

OS.CHDIR 원하는대로 작업 디렉토리를 변경할 수 있습니다 (작업 디렉토리를 추출 할 수 있습니다. cfg_path ~와 함께 os.path.dirname); 먼저 현재 디렉토리를 얻으십시오 os.getcwd exec'ing을 완료했을 때 복원하고 싶다면 cfg_path.

Python 3은 실제로 제거됩니다 execfile (파일을 읽는 시퀀스를 선호하여 compile 그러므로 내용 exec 그들), 그러나 당신은 그것에 대해 걱정할 필요가 없습니다. 현재 Python 2.6에서 코딩하고 있다면 2To3 소스 To Source Translation 은이 모든 것을 매끄럽고 원활하게 처리합니다.

편집하다: OP는 의견으로 execfile 별도의 프로세스를 시작하고 현재 작업 디렉토리를 존중하지 않습니다. 이것은 거짓이며, 다음은 다음과 같은 것을 보여주는 예입니다.

import os

def makeascript(where):
  f = open(where, 'w')
  f.write('import os\nprint "Dir in file:", os.getcwd()\n')
  f.close()

def main():
  where = '/tmp/bah.py'
  makeascript(where)
  execfile(where)
  os.chdir('/tmp')
  execfile(where)

if __name__ == '__main__':
  main()

내 컴퓨터에서 이것을 실행하면 다음과 같은 출력이 생성됩니다.

Dir in file: /Users/aleax/stko
Dir in file: /private/tmp

분명히 보여줍니다 execfile 하다 당시에 설정된 작업 디렉토리를 계속 사용하십시오. execfile 실행. (실행 된 파일이 작업 디렉토리를 변경하면 이후에 반영됩니다. execfile 반환 - 정확히 모든 것이 때문입니다 ~이다 같은 과정에서 일어나고 있습니다!).

그래서 OP가 여전히 관찰하고있는 문제가 무엇이든 ~ 아니다 현재 작업 디렉토리와 관련이 있습니다 (코드와 관찰 된 문제의 정확한 세부 사항을 보지 않고 실제로 무엇을 진단하기는 어렵습니다 ;-).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top