[英]Compile a .pyw file so it can be run like .pyc without console
我正在尝试将一个 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
(在 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 和类似的“独立”分发方法兼容。
编辑 =>事实上,如果你使用 pyInstaller,你可以简单地包含你的所有脚本并生成一个独立于 Python 安装的可执行文件,并且没有控制台(创建规范时的-w
选项)。 您甚至不需要使用包装器或更改扩展。 虽然它会是一个更大的文件,但它可能正是您要找的。
最后,以防万一,这就是您要去的地方:如果您不希望其他人从已编译的字节码中提取源代码,请不要忘记您将需要额外的预防措施。 这称为代码混淆,并且在 SO 上还有其他线程( 例如这个)。 如果您只针对该问题提出旧答案,请不要犹豫发布新问题,这些问题可能会很快发生变化。
读取.pyw
文件的解释器也能够读取 python 编译的.pyc
格式文件。 只需将您的.pyc
文件重命名为.pyw
。 它将运行(尽管它仍然是特定于版本的),并且您不会得到丑陋的控制台。
您可以使用 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
只需将 [fileName].pywc 重命名为 [fileName].pyw 并打开它。 它对我有用。 此外,当您尝试打开它进行编辑时,该代码不可见,它会像记事本中的 exe 文件一样打开。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.