Ответ 1
Вот ссылка py2exe документации и вот соответствующие пункты:
-
sys.executable
установлен полный путь к файлу exe. - Первый элемент в
sys.argv
- это полный путь к исполняемому файлу, остальные - аргументы командной строки. -
sys.frozen
существует только в исполняемом файле. Он имеет значение "console_exe" для исполняемого файла консоли, "windows_exe" для исполняемого файла без консоли и для "dll" для сервера inprocess dll. -
__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