【问题标题】:Calling a subprocess without having the system console open在不打开系统控制台的情况下调用子进程
【发布时间】:2010-12-04 23:14:06
【问题描述】:

我正在尝试从后台运行的进程启动一个 wxPython 应用程序(我已使用 py2exe 转换为 exe)。

问题在于,当 gui 应用程序打开时,控制台窗口(c:\windows\system\cmd.exe)也会打开

我查看了 this question,其中 Alex Martelli 建议将 Popencreationflags 参数设置为 0x08000000,但这并没有解决我的问题。

我还想知道是否有更好的方法在后台运行进程,目前我只是将脚本的扩展名更改为pyw,因为它没有 GUI,所以它不可见...

这是调用子进程的行

    subprocess.Popen(args="%s"%comPort,bufsize=0,
                     executable="myFrozen_WxpythonApp.exe",
                     creationflags=0x08000000, shell=False)

py2exe 脚本

...

options = {'py2exe': {'compressed': 3,
                          'optimize': 2,
                          'excludes': excludes,
                          'packages': packages,
                          'dll_excludes': dll_excludes,
                          'bundle_files': 1,
                          'dist_dir': 'dist',
                          'xref': False,
                          'skip_archive': False,
                          'ascii': False,
                          #'packages': packages,
                        'custom_boot_script': '',
                         }
                }  

      setup(options=options, windows=["app.pyw"], zipfile=None, data_files=data_files)

更新:

正如我在回答这个问题时所解释的,问题出在subprocess.Popen 电话中。

args 参数中的第一个字符串应该是可执行文件的名称,然后可执行文件名称后面可以跟任何需要传递给子进程的命令或数据。

【问题讨论】:

  • 请在您的代码块中添加一两个换行符。
  • 这与子进程和主脚本的控制台窗口无关。弹出的是WxpythonApp的控制台窗口(当你单独启动它时它应该仍然会弹出)。
  • @delnan:我希望事情就这么简单。使用py2exe 转换为exe 时设置了窗口parameter,如果我手动执行应用程序,即双击它,控制台窗口不会打开..
  • 是的……虽然很烦人!
  • 你能告诉我们py2exe脚本的相关部分吗?

标签: python subprocess


【解决方案1】:

阅读subprocess.Popen 的文档后,我发现自己做错了什么

args 参数中的第一个字符串应该是可执行文件的名称。我没有包含可执行文件的名称,因为我认为这是由 executable 参数处理的。

【讨论】:

  • 啊,很好。听起来你已经回答了自己的问题。我建议您使用找到的解决方案更新您的问题。顺便说一句,当他们说“......可以通过使用可执行参数显式设置”时,文档args参数的绝对误导,这似乎暗示它可以被排除在外args.
  • 那么可执行的para可以做什么呢?当我在**args para**中设置可执行文件名,在可执行文件para中设置可执行路径。它没有用。
  • @Samuel:我认为它的工作方式是Popen() 将使用args 中的第一个参数作为要执行的程序,除非您还提供可选的executable 参数,在这种情况下值将覆盖它。在任何一种情况下,整个 args 参数的内容都会传递给实际作为命令行运行的程序,无论它的第一个参数是否用于启动它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
相关资源
最近更新 更多