import subprocess
subprocess.call(["C:\Users\gu2124\Desktop\helloworld.ps1"])
正如此处建议的那样 从 Python 脚本运行 PowerShell 函数, 但我发现这会等待程序先执行并且不提供输出,所以我发现我需要使用 subprocess.Popen()
正如这里建议的那样 使用 Popen 来在 Python 中执行 Powershell 脚本,如何获取 Powershell 脚本的输出并将其更新到网页? 所以我试过了
import subprocess
subprocess.Popen(["C:\Users\gu2124\Desktop\helloworld.ps1"], stdout=sys.stdout)
我得到这个错误
Traceback (most recent call last):
File "C:\Users\gu2124\Desktop\pstest.py", line 5, in <module>
subprocess.Popen(["C:\Users\gu2124\Desktop\helloworld.py1"], stdout=sys.stdout)
File "C:\Python27\lib\subprocess.py", line 701, in __init__
errread, errwrite), to_close = self._get_handles(stdin, stdout, stderr)
File "C:\Python27\lib\subprocess.py", line 848, in _get_handles
c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
File "<string>", line 523, in __getattr__
File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\core\netref.py", line 150, in __getattr__
return syncreq(self, consts.HANDLE_GETATTR, name)
File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\core\netref.py", line 71, in syncreq
return conn.sync_request(handler, oid, *args)
File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\core\protocol.py", line 434, in sync_request
raise obj
AttributeError: DebugOutput instance has no attribute 'fileno'
我不完全确定这是什么意思,但从我读完这个 AttributeError: StringIO instance has no attribute ‘fileno’ 后的理解来看,这是因为我错误地弄乱了 stdout。我环顾四周,发现 为什么我的 python 子进程代码不起作用? 答案说要使用 stdout=subprocess.PIPE
所以我试过了
import subprocess
subprocess.Popen(["C:\Users\gu2124\Desktop\helloworld.ps1"], stdout=subprocess.PIPE)
这也没有给我输出最后我看到了这个 http://www.pythonforbeginners.com/os/subprocess-for-system-administrators 并将我的代码更改为此
import subprocess
p = subprocess.Popen(["powershell","C:\Users\gu2124\Desktop\helloworld.ps1"], stdout=subprocess.PIPE)
print p.communicate
我认为这可能是因为我最初尝试从命令行运行 powershell 脚本,所以我必须先打开 powershell。当我直接在命令行中键入这些命令时,它会按应有的方式工作,但是当我通过 python 脚本运行它时,它会给出这个
<bound method Popen.communicate of <subprocess.Popen object at 0x00000000026E4A90>>
我猜这是一个改进,但不是我期待的“Hello world”。我不知道接下来我应该尝试做什么才能让它发挥作用。任何帮助将不胜感激
另外,如果这里需要我正在使用的 powershell 脚本,它是
$strString = "Hello World"
write-host $strString
function ftest{
$test = "Test"
write-host $test
编辑:我尝试像第一个答案中建议的那样升级到 python 3.3,但我仍然无法让它工作。我使用了命令 p = subprocess.Popen(['powershell.exe', "C:\\Users\\gu2124\\Desktop\\helloworld.ps1"], stdout=sys.stdout)
并确定该文件在那里但出现此错误:
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
p = subprocess.Popen(['powershell.exe', "C:\\Users\\gu2124\\Desktop\\helloworld.ps1"], stdout=sys.stdout)
File "C:\Python27\lib\subprocess.py", line 701, in __init__
errread, errwrite), to_close = self._get_handles(stdin, stdout, stderr)
File "C:\Python27\lib\subprocess.py", line 848, in _get_handles
c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
UnsupportedOperation: fileno
原文由 user3282276 发布,翻译遵循 CC BY-SA 4.0 许可协议