我正在编写一个python脚本,该脚本可以检查各种条件并相应地运行powershell脚本,以帮助我自动完成从Windows XP到Windows 7的迁移。powershell脚本提供了自己的输出,可让用户了解发生的情况。我想获取powershell脚本的输出并将其打印为python脚本的输出。我环顾了一些问题,这些问题似乎想做同样的事情,但似乎对我没有帮助。最初我尝试使用
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实例没有属性'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
确保您可以运行Powershell脚本(默认情况下处于禁用状态)。您可能已经做到了。http://technet.microsoft.com/zh-CN/library/ee176949.aspx
Set-ExecutionPolicy RemoteSigned
在您的powershell脚本上运行以下python脚本helloworld.py
:
# -*- coding: iso-8859-1 -*-
import subprocess, sys
p = subprocess.Popen(["powershell.exe",
"C:\\Users\\USER\\Desktop\\helloworld.ps1"],
stdout=sys.stdout)
p.communicate()
该代码基于python3.4(或任何3.x系列解释器),尽管它也应在python2.x系列上工作。
C:\Users\MacEwin\Desktop>python helloworld.py
Hello World
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句