0

私のコード、Vincible.py は次の場所にあります。

C:\Users\Nick\Desktop\Vincible

にある midi ファイルにアクセスしようとしています。

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()

それを実行すると、例外ビットが実行され、これを正常に実行する方法を理解するのに苦労しています。私は通常、Python で異なるパスからファイルにアクセスすることはありません。そのため、ご協力をお願いします。

編集:微妙に要求されたように、コードから 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.join

しかし、繰り返しになりますが、私は os.path モジュールを初めて使用します。どんな助けでも大歓迎です。

Fredrik が推奨したように、コードを次のように修正してみました。

#!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 ファイルを削除しました。問題が解決されたら、正しい方法で追加されます。

実行すると、インタープリターは 13 行目 (「title.midi」をロードする場所) で別の pygame.error 「ファイルを開けませんでした」を発生させます。どんな助けでも大歓迎です。

4

2 に答える 2

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')
于 2013-07-21T22:33:41.310 に答える
0

Python ファイルと同じフォルダーにない場合は、ファイルを開くときにフォルダーを指定する必要があります。ファイルを開くことをお勧めし"Audio/file.midi"ます"file.midi". Fredrik によって提案された関数がなくても、それは正常に機能するはずです。ファイルの保存場所を変更した場合 (つまり、フォルダーの名前を変更したり、ファイルを移動したりした場合)、コードで変更することを忘れないでください。

編集:また、問題とは関係ありませんが、プロジェクトでもうまくいくのに役立つ補足事項として、すべてのファイルをハードコーディングするのではなく、フォルダーから動的にファイルを取得してみてください。試す:

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)
于 2013-07-22T08:32:52.210 に答える