【问题标题】:Python .exe wont run without console in the backgroundPython .exe 不会在后台没有控制台的情况下运行
【发布时间】:2021-09-05 14:29:57
【问题描述】:

我创建了一个从活动目录收集信息的 python 程序。为了收集信息,程序会运行某些 PowerShell 脚本来连接服务器。

调试完成后,我使用 pyinstaller -onefile -w 将文件转换为 .exe。当我运行 .exe 时,gui 打开没有问题,但是当我尝试执行连接到活动目录服务器的命令时,程序崩溃了。发生这种情况时,控制台中没有错误代码。在我自己排除故障一分钟后,我意识到如果我创建的 .exe 没有“-w”使控制台在后台运行,程序可以正常工作。问题是我真的不希望控制台在后台运行,因为这应该是一个用户友好的应用程序。

无论如何我可以在没有控制台窗口的情况下运行程序,或者至少在 gui 运行时将其隐藏?另外,如果这是一个愚蠢的问题,请道歉。我是编程新手,甚至是 powershell 新手。

附言这是运行 PowerShell 脚本的 python 代码的 sn-p:

pscommandUsers = '$users = ' + userNameList + ';'
pscommandHeader = 'foreach ($u in $users) {'
pscommandGroups = '$Group = Get-ADPrincipalGroupMembership -Identity $u | ' \
                  'Select-Object -ExpandProperty Name | Sort-Object | ft -hidetableheaders;'
pscommandTitles = '$ADProp = Get-ADUser -Identity $u -Properties Department, ' \
                  'Title | ForEach-Object {$_.Department, $_.Title};'
pscommandFooter = '$Array = $ADProp, $Group; Write-Output "*****" $Array}'


...process = subprocess.Popen(["powershell.exe", pscommand],
                           stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE)

output, error_description = process.communicate()

【问题讨论】:

  • ***'我创建了一个从 Active Directory 收集信息的 python 程序。 *** 只是好奇...为什么? PS 专门设计用于处理所有事物 ADDS(RSAT 或 ADSI)等等。使用 WinForms/WPF 为 PowerShell 编写 UX/UI 是一件简单的事情。
  • 嘿Postanote,好问题。我使用 python 而不是纯粹的 PowerShell 的原因是因为这个特定的工具是集成到更大程序中的众多工具之一。该程序与服务器交互、操作数据并提供其他实用程序。

标签: python powershell active-directory pyinstaller


【解决方案1】:

好的,我想通了。首先,所有不起作用的东西: - 尝试在 pyinstaller 中使用 --no 控制台创建 .exe,然后操纵子进程以隐藏控制台。 - 在子进程中尝试 Popen 之外的其他选项 - 在 pyinstaller 中尝试替代 .exe 创建程序

最终解决问题的是完全放弃 pyinstaller 并改用 cx_freeze。当使用 cx_freeze 创建我的 .exe 时,我能够在我的子进程例程中使用 creationflags= subprocess.CREATE_NO_WINDOW 并创建我的 .exe,而不会在后台使用任何烦人的控制台,而且我的程序也不会崩溃。

【讨论】:

    【解决方案2】:

    当你生成执行powershell.exe 的子进程时,看看你是否可以使用-WindowStyle <WindowStyle> 命令行参数。

    powershell.exe -WindowStyle Hidden -Command <Command(s)>
    

    文档:
    about_PowerShell_exe

    【讨论】:

    • 嘿,D-squared,感谢您的回复。所以,我浏览了 subprocess 模块,找不到 WindowStyle 属性。我也尝试将它添加到字符串中: ["powershell.exe -WindowStyle Hidden", pscommand] 但 python 也不喜欢这样。我这样做正确吗?如果我很笨,请再次原谅我,我对 PowerShell 的经验很少,更不用说子进程了。
    • 尝试将 WindowStyle 参数括在它自己的双引号集中:["powershell.exe", "-WindowStyle Hidden", pscommand]
    • 如果这不起作用,您还可以尝试以下方法:["powershell.exe", "-WindowStyle Hidden", "-NoLogo", "-NonInteractive", pscommand]
    • 还发现了这些您可能会觉得有帮助的帖子:link; link
    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 2021-12-02
    • 2020-09-20
    相关资源
    最近更新 更多