我正在编写一个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
print p.communicate
时,你打印的是方法对象,而不是运行该方法的结果。你需要将其更改为print p.communciate()
才能获得想要的结果。 - NuclearPeon