编译一个.pyw文件,以便它可以像没有控制台的.pyc一样运行

时间:2009-11-06 20:49:56

标签: python compilation

我正在尝试在没有控制台的情况下将pyw文件编译成pyc。当我尝试使用它进行直接编译时,结果是一个pywc文件,但似乎pythonw.exe没有将该扩展名注册为python.exe为pyc执行的文件之一。

结果当然是当你尝试执行时它没有双击处理程序,或者如果你将扩展名更改为pyc,你就会得到控制台。

有人知道解决这个问题的方法吗?没有控制台的.pyc的影响吗?

谢谢!

更新: 由于通过execfile运行或双击windows中的图标所以不生成此文件的编译版本,我在命令行启动python,然后:

import py_compile
py_compile.compile("[FileName].pyw")

这是我从中获取.pywc扩展名的地方。 我的Python版本是2.5.4

4 个答案:

答案 0 :(得分:6)

(在OP的帖子中进行了一些讨论后)

如果您需要的是以* .pyc或* .pyo的形式向客户端或用户提供已编译的应用程序,并避免在执行时打开控制台,那么一个好的选择是留下一个* .pyw包装器来调用主要应用。

我们假设主应用程序在main.pyc和入口点main,让我们调用包装器top.pyw,它通常看起来像:

# top.pyw file
import main
if __name__ == "__main__":
    import sys
    main.main(*sys.argv[1:])

您的main.py文件将如下所示:

# main.py file
"""
Main module documentation (optional)
"""
# import modules

# function and class definitions

def main(*argv):
    # Parses the options (optional)
    import optparse
    parser = optparse.OptionParser(usage="%prog [<options>]\n" + __doc__)
    parser.add_option(...)
    parser.add_option(...)
    opt, args = parser.parse_args(list(argv))
    # Calls the appropriate function:
    my_function(...)

另请注意,* .pyc往往是特定于版本的。您可以检查上述解决方案是否与pyInstaller and similar "independent" distribution methods兼容。

编辑=&gt; 实际上,如果您使用pyInstaller,您可以简单地包含所有脚本并生成一个独立于Python安装的可执行文件,并且不启动控制台({{ 1}}创建规范时的选项)。您甚至不需要使用包装器或更改扩展。虽然它将是一个更大的文件,但这可能就是你想要的。

最后,以防万一你要去的地方:如果你不希望别人从编译的字节码中提取源代码,不要忘记你需要额外的预防措施。这称为代码混淆,并且SO上还有其他线程(for example this one)。如果您只是在那个问题上找到旧答案,请不要犹豫,发布一个新问题,这些事情可以快速改变。

答案 1 :(得分:3)

您可以使用FTYPE和ASSOC命令将.pywc文件与pythonw.exe关联。

ASSOC用于将扩展名与文件类型相关联,FTYPE将文件类型与用于打开它的命令相关联。以下命令显示我的计算机上的现有关联:

C:\Python26>assoc .py
.py=Python.File

C:\Python26>assoc .pyc
.pyc=Python.CompiledFile

C:\Python26>assoc .pyw
.pyw=Python.NoConFile

C:\Python26>assoc .pywc
File association not found for extension .pywc

这些命令通过文件类型显示扩展程序所关联的程序:

C:\Python26>ftype Python.CompiledFile
Python.CompiledFile="C:\Python26\python.exe" "%1" %*

C:\Python26>ftype Python.NoConFile
Python.NoConFile="C:\Python26\pythonw.exe" "%1" %*

所以看起来你可以将.pywc文件和Python.NoConFile关联起来:

assoc .pywc=Python.NoConFile

答案 2 :(得分:3)

读取.pyw文件的解释器也能够读取python编译的.pyc格式文件。只需将.pyc文件重命名为.pyw即可。它会运行(虽然它仍然是版本特定的),你不会得到丑陋的控制台。

答案 3 :(得分:0)

只需将[fileName] .pywc重命名为[fileName] .pyw并将其打开。它对我有用。同样,当您尝试打开代码进行编辑时,该代码也不可见。它像记事本中的exe文件一样打开。