Вот py2exe documentation reference и здесь соответствующие пункты:
sys.executable
установлен на полный путь к EXE-файла.
- Первый элемент в
sys.argv
- полное имя исполняемого файла, остальные - аргументы командной строки.
sys.frozen
только в исполняемом файле. Он имеет значение «console_exe» для исполняемого файла консоли, «windows_exe» для исполняемого файла без консоли и для «dll» для сервера inprocess dll.
__file__
не определен (вы можете использовать sys.argv [0] вместо)
Это не очевидно из этих Документов ли «ех-файл» и «исполняемые» одно и то же , и, таким образом, то же самое: sys.executable
и sys.argv[0]
. Глядя на код, который работал как script.py и py2exe_executable.exe последний раз, когда я должен был сделать это, я нахожу что-то вроде:
if hasattr(sys, 'frozen'):
basis = sys.executable
else:
basis = sys.argv[0]
required_folder = os.path.split(basis)[0]
Как я уже говорил, что работал, но я не помню, почему я думал, что было необходимо вместо того, чтобы просто использовать sys.argv[0]
.
Использование только basis
было подходящим для работы в руке (чтение файлов в этом каталоге). Для более постоянной записи разделите что-то вроде os.path.realpath(basis)
.
Обновление На самом деле сделал тест; бьет догадки и крепление кресла :-)
Реферат: Игнорировать sys.frozen, игнорировать sys.executable, перейти с sys.argv [0] безоговорочно.
Evidence:
=== foo.py ===
# coding: ascii
import sys, os.path
print 'sys has frozen:', hasattr(sys, 'frozen')
print 'using sys.executable:', repr(os.path.dirname(os.path.realpath(sys.executable)))
print 'using sys.argv[0]:', repr(os.path.dirname(os.path.realpath(sys.argv[0] )))
=== установки.ру ===
from distutils.core import setup
import py2exe
setup(console=['foo.py'])
=== Результаты ===
C:\junk\so\py2exe>\python26\python foo.py
sys has frozen: False
using sys.executable: 'C:\\python26'
using sys.argv[0]: 'C:\\junk\\so\\py2exe' # where foo.py lives
C:\junk\so\py2exe>dist\foo
sys has frozen: True
using sys.executable: 'C:\\junk\\so\\py2exe\\dist'
using sys.argv[0]: 'C:\\junk\\so\\py2exe\\dist' # where foo.exe lives
Существует более старый дублированный вопрос, но с меньшими ответами: [Определение пути приложения в Python EXE, сгенерированном pyInstaller] (http://stackoverflow.com/questions/404744) – olibre