Python .exe 不会在没有控制台的情况下在后台运行

时间:2021-06-22 00:08:11

标签: python powershell active-directory pyinstaller

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

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

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

附言这是运行 PowerShell 脚本的 Python 代码片段:

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()

2 个答案:

答案 0 :(得分:1)

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

最终解决问题的是完全删除 pyinstaller 并使用 cx_freeze 代替。使用 cx_freeze 创建我的 .exe 时,我能够在我的子进程例程中使用 creationflags= subprocess.CREATE_NO_WINDOW 并在没有任何烦人的后台控制台的情况下创建我的 .exe,而且我的程序也不会崩溃。

答案 1 :(得分:0)

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

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

文档:
about_PowerShell_exe