Spróbuję również rozwiązać kilka wariantów tego pytania:
- znalezienie ścieżki wywoływanego skryptu
- znalezienie ścieżki aktualnie wykonywanego skryptu
- znajdowanie katalogu wywoływanego skryptu
(Niektóre z tych pytań zostały zadane na SO, ale zostały zamknięte jako duplikaty i przekierowane tutaj).
Ostrzeżenia dotyczące używania __file__
W przypadku zaimportowanego modułu:
import something
something.__file__
zwróci bezwzględną ścieżkę modułu. Biorąc jednak pod uwagę następujący skrypt foo.py:
#foo.py
print '__file__', __file__
Wywołanie go za pomocą „python foo.py” zwróci po prostu „foo.py”. Jeśli dodasz shebang:
#!/usr/bin/python
#foo.py
print '__file__', __file__
i nazwij to używając ./foo.py, zwróci „./foo.py”. Wywołanie go z innego katalogu (np. Umieść foo.py w pasku katalogu), a następnie wywołanie jednego z nich
python bar/foo.py
lub dodanie shebang i bezpośrednie wykonanie pliku:
bar/foo.py
zwróci „bar / foo.py” ( ścieżka względna ).
Znajdowanie katalogu
Teraz stamtąd, aby uzyskać katalog, os.path.dirname(__file__)
może być również trudne. Przynajmniej w moim systemie zwraca pusty ciąg, jeśli wywołasz go z tego samego katalogu co plik. dawny.
# foo.py
import os
print '__file__ is:', __file__
print 'os.path.dirname(__file__) is:', os.path.dirname(__file__)
wyświetli:
__file__ is: foo.py
os.path.dirname(__file__) is:
Innymi słowy, zwraca pusty ciąg, więc nie wydaje się wiarygodny, jeśli chcesz go użyć dla bieżącego pliku (w przeciwieństwie do pliku importowanego modułu). Aby obejść ten problem, możesz zawrzeć go w wywołaniu abspath:
# foo.py
import os
print 'os.path.abspath(__file__) is:', os.path.abspath(__file__)
print 'os.path.dirname(os.path.abspath(__file__)) is:', os.path.dirname(os.path.abspath(__file__))
która generuje coś takiego:
os.path.abspath(__file__) is: /home/user/bar/foo.py
os.path.dirname(os.path.abspath(__file__)) is: /home/user/bar
Zauważ, że abspath () NIE rozpoznaje dowiązań symbolicznych. Jeśli chcesz to zrobić, użyj zamiast tego realpath (). Na przykład utworzenie dowiązania symbolicznego file_import_testing_link wskazujące na file_import_testing.py, o następującej treści:
import os
print 'abspath(__file__)',os.path.abspath(__file__)
print 'realpath(__file__)',os.path.realpath(__file__)
wykonanie spowoduje wydrukowanie ścieżek bezwzględnych, takich jak:
abspath(__file__) /home/user/file_test_link
realpath(__file__) /home/user/file_test.py
file_import_tporting_testing -> file_import_testing.py
Korzystanie z inspekcji
@SummerBreeze wspomina o module inspekcji .
Wydaje się, że działa to dobrze i jest dość zwięzłe w przypadku importowanych modułów:
import os
import inspect
print 'inspect.getfile(os) is:', inspect.getfile(os)
posłusznie zwraca absolutną ścieżkę. Jednak aby znaleźć ścieżkę aktualnie wykonywanego skryptu, nie widziałem sposobu, aby go użyć.