Kiedyś otwierałem pliki, które znajdowały się w tym samym katalogu, co aktualnie uruchomiony skrypt Pythona, po prostu używając polecenia takiego jak
open("Some file.txt", "r")
Jednak odkryłem, że gdy skrypt był uruchamiany w systemie Windows przez dwukrotne kliknięcie, próbował otworzyć plik z niewłaściwego katalogu.
Od tego czasu używam polecenia formularza
open(os.path.join(sys.path[0], "Some file.txt"), "r")
kiedykolwiek chciałem otworzyć plik. Działa to dla mojego konkretnego zastosowania, ale nie jestem pewien, czy sys.path[0]
może się nie powieść w innym przypadku użycia.
Więc moje pytanie brzmi: jaki jest najlepszy i najbardziej niezawodny sposób na otwarcie pliku, który znajduje się w tym samym katalogu, co aktualnie uruchomiony skrypt Pythona?
Oto, co udało mi się do tej pory ustalić:
os.getcwd()
ios.path.abspath('')
zwraca „bieżący katalog roboczy”, a nie katalog skryptów.os.path.dirname(sys.argv[0])
ios.path.dirname(__file__)
zwróć ścieżkę używaną do wywołania skryptu, która może być względna lub nawet pusta (jeśli skrypt znajduje się w cwd). Ponadto__file__
nie istnieje, gdy skrypt jest uruchamiany w środowisku IDLE lub PythonWin.sys.path[0]
ios.path.abspath(os.path.dirname(sys.argv[0]))
wydaje się zwracać katalog skryptów. Nie jestem pewien, czy jest jakaś różnica między tymi dwoma.
Edytować:
Właśnie zdałem sobie sprawę, że to, co chcę zrobić, lepiej byłoby opisać jako „otwórz plik w tym samym katalogu, co zawierający moduł”. Innymi słowy, jeśli importuję moduł, który napisałem, który znajduje się w innym katalogu i ten moduł otwiera plik, chcę, aby szukał pliku w katalogu modułu. Nie sądzę, aby cokolwiek, co znalazłem, było w stanie to zrobić ...
__file__
nie można użyć, użyjsys.argv[0]
zamiastdirname(__file__)
. Reszta powinna działać zgodnie z oczekiwaniami. Lubię używać,__file__
ponieważ w kodzie bibliotekisys.argv[0]
może w ogóle nie wskazywać na twój kod, szczególnie jeśli jest importowany za pomocą skryptu innej firmy.