python命令行选项到已编译的python文件(py2exe)

时间:2018-04-06 18:47:49

标签: python command-line-arguments py2exe cpython

我和许多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”参数有效?在我的可执行文件中作为一个选项是最重要的。

1 个答案:

答案 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,
)