我和许多python程序员一样,发现python描述here的命令行参数非常有用。特别是“-i”,它在程序完成堆栈跟踪后保持python解释器运行。如何在py2exe编译的exe文件中使用这些?不要与exe文件中的常规参数解析相混淆。如果你来找那个,找到它here。 我的第一个想法是尝试:
pyprogram.exe -i -foo -bar
但这不起作用。 应该注意的是
pyprogram.exe -foo -bar
实际上对我有用。 我正在寻找的是.exe相当于
python -i pyprogram.py foo bar
未能找到适用于所有python命令行选项的实现,我可以做些什么才能使“-i”参数有效?在我的可执行文件中作为一个选项是最重要的。
答案 0 :(得分:1)
我在py2exe wiki上没有找到关于传递-i
等参数的任何内容(在执行后进入交互模式)。
<小时/> 人们可能能够在py2exe source files中发现有关参数处理的信息 更新:看起来py2exe看起来确实没有像普通解释器那样处理任何命令行选项,而只是它们只是passes到脚本。但它确实handle相应的环境变量,可以如下所示使用。
但是,作为解决方法,您可以尝试set PYTHONINSPECT
Environment variable:
如果将其设置为非空字符串,则相当于指定-i选项。
E.g。在运行程序之前运行set PYTHONINSPECT=TRUE
。
但是,可能更好,这可以在Python脚本中完成:
使用os.environ也可以通过Python代码修改此变量,以便在程序终止时强制检查模式。
这是os.environ(也是os.putenv)的一个小测试脚本:
import os
one = os.environ
os.putenv("PYTHONINSPECT", "TRUE")
two = os.environ
os.environ["PYTHONINSPECT"] = "TRUE"
three = os.environ
print(one)
print(two)
print(three)
print( set(one.items()) ^ set(two.items()) )
print( set(one.items()) ^ set(three.items()) )
行为有点奇怪:似乎没有什么区别,它似乎只会持续到你退出交互模式:
G:\>py test.py > test.txt
>>> exit()
G:\>set PYTHONINSPECT
Environment variable PYTHONINSPECT not defined
test.txt
的内容是:
environ({'ALLUSERSPROFILE': 'C:\\ProgramData', ... 'PYTHONINSPECT': 'TRUE'})
environ({'ALLUSERSPROFILE': 'C:\\ProgramData', ... 'PYTHONINSPECT': 'TRUE'})
environ({'ALLUSERSPROFILE': 'C:\\ProgramData', ... 'PYTHONINSPECT': 'TRUE'})
set()
set()
但它似乎以任何一种方式工作(仔细检查文档以确保您不会破坏您的环境变量),因此您甚至可以为自己实现-i
参数:
import sys, os
if len(sys.argv) > 1 and sys.argv[1] == '-i':
os.putenv("PYTHONINSPECT", "TRUE")
#os.environ["PYTHONINSPECT"] = "TRUE"
print("interactive")
else:
print("normal")
运行如下
G:\>py test.py
normal
G:\>py test.py -i
interactive
>>> quit()
G:\>set PYTHONINSPECT
Environment variable PYTHONINSPECT not defined
尝试使用py2exe和Python 3.4.3(显然不支持较新版本和you get an IndexError):
setup.py:
from distutils.core import setup
import py2exe
setup(console=['test.py'])
获取py2exe
G:\>c:\Python34\Scripts\pip.exe install py2exe
You are using pip version 6.0.8, however version 10.0.0b2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Collecting py2exe
Using cached py2exe-0.9.2.2-py33.py34-none-any.whl
Installing collected packages: py2exe
Successfully installed py2exe-0.9.2.2
运行py2exe
G:\>c:\Python34\python.exe setup.py py2exe
running py2exe
3 missing Modules
------------------
? readline imported from cmd, code, pdb
? win32api imported from platform
? win32con imported from platform
Building 'dist\test.exe'.
Building shared code archive 'dist\library.zip'.
Copy c:\windows\system32\python34.dll to dist
Copy c:\Python34\DLLs\_hashlib.pyd to dist\_hashlib.pyd
Copy c:\Python34\DLLs\pyexpat.pyd to dist\pyexpat.pyd
Copy c:\Python34\DLLs\select.pyd to dist\select.pyd
Copy c:\Python34\DLLs\unicodedata.pyd to dist\unicodedata.pyd
Copy c:\Python34\DLLs\_ctypes.pyd to dist\_ctypes.pyd
Copy c:\Python34\DLLs\_socket.pyd to dist\_socket.pyd
Copy c:\Python34\DLLs\_lzma.pyd to dist\_lzma.pyd
Copy c:\Python34\DLLs\_ssl.pyd to dist\_ssl.pyd
Copy c:\Python34\DLLs\_bz2.pyd to dist\_bz2.pyd
测试
G:\>dist\test.exe
normal
G:\>dist\test.exe -i
interactive
>>> sys.exit()
似乎没有永久更改环境变量:
G:\>set PYTHONINSPECT
Environment variable PYTHONINSPECT not defined
也适用于single exe:
from distutils.core import setup
import py2exe
setup(
options = {'py2exe': {'bundle_files': 1, 'compressed': True}},
console = [{'script': "test.py"}],
zipfile = None,
)