2013-03-05 5 views
1

그래서이 클래스를 제목 화면 용으로 코딩 했으므로 잘 작동합니다. 그러나 프로젝트에서 함께 일하는 사람들 중 한 명은 다음과 같이 사용하지 말아야한다고 언급했습니다.python은 어디에서 스크립트 파일을 찾습니다?

os.chdir(os.getcwd() + "/..") 

resource = (os.getcwd() + "/media/file name") 

슈퍼 디렉토리로 이동하려면 다음을 사용하십시오. 그는 pythonpath에 대해 언급했습니다. 이것이 도움이된다면 Eclipse를 사용하고 있습니다.

더 많은 맥락에서 우리는 멀티 플랫폼 게임을 만들고 있으므로 디렉토리를 동기화하고 하드 코드 할 수는 없습니다 (git을 사용하기 때문에 작업 디렉토리가 동기화되므로). 기본적으로 "src"폴더에있는 스크립트 파일을 옆에있는 "media"폴더로 가져 오는 방법이 필요합니다 ("src"및 "media"폴더가있는 수퍼 (프로젝트) 폴더가 있습니다)

도움이 될만한 의견이 있지만 여기에 오기 전에 시도했기 때문에 "google it"이라고 말하지 마십시오. 여기에 자주 올지 모르겠지만 너무 많이 보았습니다. 다른 곳에서 시간은 ... 나는 내가

+0

나는 그것을 볼 수 없다. 현재 솔루션이 어떻게 비슷한 지 알지만 문제 일뿐입니다. 이것을 할 수있는 방법이 있습니다. 내가하는 방법보다 낫습니다. – ElectricErger

+0

제목이 가리키는 것처럼, 질문은 스크립트/프로그램 *에 상대적인 디렉토리로 이동하는 것보다 부모 디렉토리에 도착하는 것이 중요하지 않다고 생각합니다. 그래서,이 질문은 http://stackoverflow.com/q/2860153/42973의 복제본이 아니라고 생각합니다. – EOL

답변

2

파이썬 프로그램의 인식은 일반적으로 스크립트가 실행되는 디렉토리입니다 현재 작업 디렉토리의 개념을해야합니까. 이것은 상대 경로로 "파일을 찾는 위치"입니다. 프로그램이이에있는 것과 다른 폴더에서 실행 될 수 있기 때문에

그러나, 참조의 디렉토리 대신 (현재 디렉토리가 하지입니다에 스크립트가있는 디렉토리를 참조 할 필요가 일반적으로 스크립트의 위치와 관련된). 스크립트가 발견 된 디렉토리는이 경로가 (비어)의 상대가 될 수

script_dir = os.path.dirname(__file__) 

참고로 얻을 수있다, 그래서 스크립트의 현재 작업 디렉토리는 디렉토리와 동일한 것이 여전히 중요하다 때를 스크립트는 파이썬 인터프리터 (__file__이 설정된 경우)에서 읽습니다.

# If script_dir is relative, the current working directory is used, here. This is correct if the current 
# working directory is the same as when the script was read by the Python interpreter (which is 
# when __file__ was set): 
script_dir = os.path.abspath(script_dir) 

당신은 다음 플랫폼 독립적 인

와 상위 디렉토리에있는 디렉토리 media 얻을 수 있습니다 : 현재 작업 디렉토리가 나중에 코드에서 변경되는 경우는 절대 경로로 script_dir 가능성이있는 상대를 변환하는 것이 중요하다 사실 os.path.pardir (또는 동등 os.pardir)에서
os.path.join(script_dir, os.path.pardir, 'media') 

는 플랫폼 독립적 인 상위 디렉토리 규칙이며, os.path.join() 단순히 플랫폼에 독립적 인 방법으로 경로를 결합한다.

+1

+1 '__file__'을 사용하고'abspath' 문제를 해결하려면 –

0

os.path.dirname()os.path.join() 사용을 고려) 말하는위한 jerkish 소리 미안하면 답변에 대한 인터넷 검색 한 때. 다음은 플랫폼에 독립적 인 방식으로 작동합니다.

+0

so.path.dirname()에 대한 경로가 필요하지 않으며 해당 플랫폼에 종속되지 않습니까? – ElectricErger

+1

예, 사용합니다. - os.path.dirname (os.path.abspath (__ file __))을 사용합니다. – wim

+0

@JimGarrison : 스크립트가 현재 디렉토리에서 실행되지 않으면 작동하지 않습니다. 어떤 사람들은 질문의 코드가 "사용되어서는 안된다"는 말을 한 이유가 있습니다 (코드의 다른 부분이 현재 작업 디렉토리를 변경할 수도 있음). – EOL

1

뭔가를 권 해드립니다 like :

import os.path 

base_folder = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
media_folder = os.path.join(base_folder, "media") 
src_folder = os.path.join(base_folder, "src") 

resource = os.path.join(media_folder, "filename") 

for path in [base_folder, media_folder, src_folder, resource]: 
    print path 

주요 성분은 다음과 같습니다

  • __file__

    가 : 경로를 분할 :
  • os.path.split() (경로 호출 된 스크립트를 제공 sys.argv[0] 달리) 현재 소스 파일의 경로를 가져옵니다 상대 파일/폴더 이름과 폴더가 들어있는 기본 폴더에 저장합니다. base_folder = ...에서 두 번 사용하면 상위 디렉토리가 제공됩니다.
  • os.path.join : 경로 이름의 OS 독립적이며 올바른 조합. S 없거나 여러 /들 또는 \
+0

-1 파이썬 파일이 어떻게 호출되는지에 달려 있기 때문입니다. 'os.path.split (__ file __) [0]'은 어떤 경우에는 비어있을 수 있습니다. 또한 이미'os.path.dirname'을 수행하는 내장 된 방법이 있으므로'split '을 사용하는 것보다 그것을 사용하는 것을 선호합니다. – wim

+1

'dirname'은 제가 사용하기로 한 의미입니다. 이것을 반영하는 대답이 수정되었습니다. 내 답변의 요점은 이전 답변에서 언급되지 않은'__file__'의 사용법입니다. –

+2

당신이 맞기 때문에'__file__ '이 가장 좋은 참조 디렉토리입니다. 왜냐하면'media' 폴더는 스크립트를 기준으로 배치 되었기 때문에 사용자가 실행하는 곳이 아니라 현재 디렉토리가 관련이 없습니다. – EOL

관련 문제