2013-07-21 1 views
0
내 코드, Vincible.py는

나는 문제가 다른 폴더에 미디 파일에 액세스하는 데

C:\Users\Nick\Desktop\Vincible 

에 위치하고 있으며 나는

C:\Users\Nick\Desktop\Vincible\Audio 
에있는 미디 파일에 액세스하기 위해 노력하고있어

내가 함께 넣어했습니다

#!C:\Python33\python.exe 
import sys, pygame, os.path 

print("Loading...") 
pygame.mixer.pre_init(44100, -16, 2, 2048) 
try: 
    pygame.mixer.music.load(os.path.join('Audio', 'title.midi')) 
    pygame.mixer.music.load(os.path.join('Audio', 'dun1.midi')) 
    pygame.mixer.music.load(os.path.join('Audio', 'dun2.midi')) 
    pygame.mixer.music.load(os.path.join('Audio', 'dun3.midi')) 
    pygame.mixer.music.load(os.path.join('Audio', 'dun4.midi')) 
    pygame.mixer.music.load(os.path.join('Audio', 'dun5.midi')) 
    pygame.mixer.music.load(os.path.join('Audio', 'dun6.midi')) 
    pygame.mixer.music.load(os.path.join('Audio', 'echostheme')) 
    pygame.mixer.music.load(os.path.join('Audio', 'town1.midi')) 
    pygame.mixer.music.load(os.path.join('Audio', 'town2.midi')) 
    pygame.mixer.music.load(os.path.join('Audio', 'town3.midi')) 
except: 
    raise UserWarning("Could not load or play soundfiles in 'Audio' folder") 
pygame.init() 
size = width, height = 580, 444 
screen = pygame.display.set_mode(size) 
print("Loaded!") 

while 1: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      sys.exit() 
    pygame.mixer.Sound('title.midi').play() 

그것을 실행되면, 그것은 비트와 I를 제외하고 실행 을 성공적으로 수행하는 방법을 설명하기 위해 고심하고 있습니다. 나는 일반적으로 으로 파이썬에서 다른 경로의 파일에 액세스하지 않으므로 도움이 매우 도움이됩니다. 많이 감사합니다.

편집 : 미묘하게 요청하면 코드에서 try/except를 삭제했습니다.

#!C:\Python33\python.exe 
import sys, pygame, os.path 

print("Loading...") 
pygame.mixer.pre_init(44100, -16, 2, 2048) 
pygame.init() 

pygame.mixer.music.load(os.path.join('Audio', 'title.midi')) 
pygame.mixer.music.load(os.path.join('Audio', 'dun1.midi')) 
pygame.mixer.music.load(os.path.join('Audio', 'dun2.midi')) 
pygame.mixer.music.load(os.path.join('Audio', 'dun3.midi')) 
pygame.mixer.music.load(os.path.join('Audio', 'dun4.midi')) 
pygame.mixer.music.load(os.path.join('Audio', 'dun5.midi')) 
pygame.mixer.music.load(os.path.join('Audio', 'dun6.midi')) 
pygame.mixer.music.load(os.path.join('Audio', 'echostheme')) 
pygame.mixer.music.load(os.path.join('Audio', 'town1.midi')) 
pygame.mixer.music.load(os.path.join('Audio', 'town2.midi')) 
pygame.mixer.music.load(os.path.join('Audio', 'town3.midi')) 

size = width, height = 580, 444 
screen = pygame.display.set_mode(size) 
print("Loaded!") 

while 1: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      sys.exit() 
    pygame.mixer.Sound('title.midi').play() 

이 시간이 다 넣어 : 여기에 새로운 코드

Traceback (most recent call last): 
    File "C:\Users\Nick\Desktop\Vincible\Vincible.py", line 8, in <module> 
    pygame.mixer.music.load(os.path.join('Audio', 'title.midi')) 
pygame.error: Couldn't open 'Audio\title.midi' 

파일이 손상되지이며

Vincible\Audio 

에 참으로하지만 여전히이 오류를 반환하는 것 . 나는이을 os.path 모듈에 새로운 해요, 다시 다음

os.path.join 

하지만 내 사용과 관련 수있는 뭔가가 상상하는 것입니다. 어떤 도움도 대단히 입니다.

프레드릭 권장, 나는이 내 코드를 수정 시도 :

#!C:\Python33\python.exe 
import sys, pygame, os.path 

print("Loading...") 
pygame.mixer.pre_init(44100, -16, 2, 2048) 
pygame.init() 

def load(midi_file): 
    module_directory = os.path.dirname(__file__) 
    filename = os.path.join(module_directory, 'Audio', midi_file) 
    pygame.mixer.music.load(filename) 

load("title.midi") 

size = width, height = 580, 444 
screen = pygame.display.set_mode(size) 
print("Loaded!") 

while 1: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      sys.exit() 
    titlemusic.play(-1) 

참고 : 나는 더 읽기/코드 작게 멀리 다른 .midi 파일을 모두했다, 문제가 후 해결되었으므로 올바른 방식으로 추가됩니다.

실행하면 해석기가 다른 pygame.error 파일을 13 행 ("title.midi"를로드 할 때)에서 열 수 없습니다. 어떤 도움을 주셔서 감사합니다. .

+2

단지 '예외'가 없다면 실제로 어떤 오류가 생성되었는지 확인할 수 있습니다 ... 아마도 스스로 문제를 해결할 수 있습니다. 적어도 우리를 도울 수있는 것에 더 가까이 가십시오. – kindall

+0

오른쪽, 죄송합니다. 나는 그것을 시도하고 새로운 결과를보고 할 것입니다. –

+0

수수께끼. 그래서 이것이 파이 게임이 당신이나 다른 일을 저지르고 있는지 확인하기 위해 파이 게임로드 호출 바로 전에'open (filename) .read()'를 추가하여 파일이 실제로 읽을 수 있는지 확인하려고합니다. – Fredrik

답변

0

."file.midi" 대신 파일을 "Audio/file.midi"으로 여는 것이 좋습니다. Fredrik이 제안한 기능을 사용하면 문제가 해결됩니다. 파일이 저장된 위치를 변경하면 (즉, 폴더의 이름을 바꾸거나 파일을 이동하는 경우) 코드에서 코드를 변경하는 것을 잊지 마십시오.

EDIT : 또한 문제와 관련이 없지만 프로젝트에서 잘 도와주는 보조 노트 인 경우 모든 파일을 하드 코딩하지 않고 폴더에서 동적으로 가져 오는 것이 좋습니다. 시도해보십시오 :

import os #this is a handy module with operating system functions 

def getMusic(place): #where place is the name of the folder in this case "Audio/". Don't forget the slash! 
    for file in os.listdir(place): #os.listdir returns a list of all the files in a directory. 
     pygame.mixer.music.load(place+file) 
+0

그의 첫번째 예제가 그랬다. – Fredrik

+0

정확하게 동일하지는 않지만 os.path.join을 사용하지 않고 있습니다. 그럴 필요가 없습니다. –

+0

아래쪽에있는 코드는 문제의 해결책이 아닙니다. 그의 코드를 좀 더 다이나믹하게 만들기 위해 가장 중요한 부분은 그의 문제에 대한 해결책이라고 생각한다. –

1

경로가 반드시 스크립트 나 모듈에있는 디렉토리와 동일한 것이 아니다 현재 디렉토리를 기준으로 그것이 무엇인지 확인하려면 추가

print os.getcwd() 

가 상대 경로를 계산하기 모듈 디렉토리, 당신은 같은 것을 할 수 있습니다

module_directory = os.path.dirname(__file__) 
filename = os.path.join(module_directory, 'Audio', 'town3.midi') 

( __file__ 당신에게 모듈의 파일 이름, 파일 부분 해제 os.path.dirname 스트립을 제공)

간단한 도우미 기능이 유용 할 수 있습니다 : 그것은 당신의 파이썬 파일과 같은 폴더에 열려있는 파일이 아닌 경우 때 폴더를 지정해야합니다

def load(midi_file): 
    filename = os.path.join(module_directory, 'Audio', midi_file) 
    pygame.mixer.music.load(filename) 

load('town1.midi') 
load('town2.midi') 
load('town3.midi') 
+0

응답 해 주셔서 감사합니다. 나는 이것을 시도했으나 다른 pygame.error를 발생시켰다. "C : \ Users] Nick] Desktop \ Vincible \ Audio \ title.midi"을 열 수 없습니다. 참조 용으로 상단에 새로운 수정 된 코드를 게시합니다. –

+0

경로에 있습니까? 이상하게 보입니다. 파이 게임을 설정하기 전에'print (os.getcwd()) '문을 추가 할 수 있습니까? – Fredrik

+0

os.getcwd()를 시작하면 "C : \ Users \ Nick \ Desktop \ Vincible "앞에서 말했듯이, 파일들은"C : \ Users \ Nick \ Desktop \ Vincible \ Audio "에있다. (참조 용으로 거기 던져 넣었다.) –

관련 문제