我创建了一个从活动目录收集信息的 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()
答案 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)>