Хорошо, вот что я делаю
sys.argv - это всегда то, что вы вводите в терминал или используете в качестве пути к файлу при выполнении его с помощью python.exe или pythonw.exe
Например, вы можете запустить файл text.py несколькими способами, каждый из которых даст вам свой ответ, он всегда даст вам путь, по которому был набран python.
C:\Documents and Settings\Admin>python test.py
sys.argv[0]: test.py
C:\Documents and Settings\Admin>python "C:\Documents and Settings\Admin\test.py"
sys.argv[0]: C:\Documents and Settings\Admin\test.py
Хорошо, знайте, что вы можете получить имя файла, очень важно, теперь, чтобы получить каталог приложения, который вы знаете, используйте os.path, в частности, abspath и dirname
import sys, os
print os.path.dirname(os.path.abspath(sys.argv[0]))
Это выведет это:
C:\Documents and Settings\Admin\
всегда будет выводить это независимо от того, наберете ли вы python test.py или python "C: \ Documents and Settings \ Admin \ test.py"
Проблема с использованием __file __
Рассмотрим эти два файла
test.py
import sys
import os
def paths():
print "__file__: %s" % __file__
print "sys.argv: %s" % sys.argv[0]
a_f = os.path.abspath(__file__)
a_s = os.path.abspath(sys.argv[0])
print "abs __file__: %s" % a_f
print "abs sys.argv: %s" % a_s
if __name__ == "__main__":
paths()
import_test.py
import test
import sys
test.paths()
print "--------"
print __file__
print sys.argv[0]
Вывод "python test.py"
C:\Documents and Settings\Admin>python test.py
__file__: test.py
sys.argv: test.py
abs __file__: C:\Documents and Settings\Admin\test.py
abs sys.argv: C:\Documents and Settings\Admin\test.py
Вывод "python test_import.py"
C:\Documents and Settings\Admin>python test_import.py
__file__: C:\Documents and Settings\Admin\test.pyc
sys.argv: test_import.py
abs __file__: C:\Documents and Settings\Admin\test.pyc
abs sys.argv: C:\Documents and Settings\Admin\test_import.py
--------
test_import.py
test_import.py
Итак, как вы видите, file всегда дает вам файл python, из которого он запускается, где sys.argv [0] дает вам файл, который вы всегда запускали из интерпретатора. В зависимости от ваших потребностей вам нужно будет выбрать тот, который лучше всего соответствует вашим потребностям.