Вот справочник по документации py2exe , и вот соответствующие пункты:
sys.executable
- полный путь к exe-файлу.
- Первый элемент в
sys.argv
- это полный путь к исполняемому файлу, остальные - аргументы командной строки.
sys.frozen
существует только в исполняемом файле. Он установлен на «console_exe» для исполняемого файла консоли, «windows_exe» для исполняемого файла GUI без консоли и на «dll» для сервера dll inprocess.
__file__
не определено (вы можете использовать вместо sys.argv [0])
Из этих документов не очевидно, являются ли exe-файл и исполняемый файл одним и тем же, и, следовательно, являются ли 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].
Данные:
=== 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] )))
=== setup.py ===
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