title: Running powershell script within python script, how to make python print the powershell output while it is running
body: <p>I am writing a python script which checks various conditions and runs a powershell script accordingly to help me automate migration from windows XP to windows 7. The powershell script gives its own output giving the user updates as to what is happening. I would like to take the output of the powershell script and print it as output of the python script. I have looked around at some questions which seem to want to do the same thing but they don't seem to be working for me. Initially I tried using</p>
  
  <pre><code>import subprocess
  subprocess.call(["C:\Users\gu2124\Desktop\helloworld.ps1"])
  </code></pre>
  
  <p>As was suggested here <a href="https://stackoverflow.com/questions/14508809/run-powershell-function-from-python-script">Run PowerShell function from Python script</a> but I found out that this waits for the program to execute first and does not give output so I found out I need to use <code>subprocess.Popen()</code> as was suggusted here <a href="https://stackoverflow.com/questions/4668610/use-popen-to-execute-a-powershell-script-in-python-how-can-i-get-the-powershell">Use Popen to execute a Powershell script in Python, how can I get the Powershell script&#39;s output and update it to web page?</a> so I tried this</p>
  
  <pre><code>import subprocess
  subprocess.Popen(["C:\Users\gu2124\Desktop\helloworld.ps1"], stdout=sys.stdout)
  </code></pre>
  
  <p>and I get this error </p>
  
  <pre><code>Traceback (most recent call last):
    File "C:\Users\gu2124\Desktop\pstest.py", line 5, in &lt;module&gt;
      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 "&lt;string&gt;", 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'
  </code></pre>
  
  <p>I'm not completely sure what this means but from what I think I understand after reading this <a href="https://stackoverflow.com/questions/5903501/attributeerror-stringio-instance-has-no-attribute-fileno">AttributeError: StringIO instance has no attribute &#39;fileno&#39;</a> is that it is because I am messing with the stdout incorrectly. I looked a around more and I found this <a href="https://stackoverflow.com/questions/16544362/why-wont-my-python-subprocess-code-work">Why won&#39;t my python subprocess code work?</a> where the answers said to use <code>stdout=subprocess.PIPE</code> so I tried this </p>
  
  <pre><code>import subprocess
  subprocess.Popen(["C:\Users\gu2124\Desktop\helloworld.ps1"], stdout=subprocess.PIPE)
  </code></pre>
  
  <p>which also does not give me output
  Finally I saw this <a href="http://www.pythonforbeginners.com/os/subprocess-for-system-administrators" rel="noreferrer">http://www.pythonforbeginners.com/os/subprocess-for-system-administrators</a> and changed my code to this </p>
  
  <pre><code>import subprocess
  p = subprocess.Popen(["powershell","C:\Users\gu2124\Desktop\helloworld.ps1"], stdout=subprocess.PIPE)
  print p.communicate
  </code></pre>
  
  <p>I thought that it may because I am initially trying to run a powershell script from the command line so I have to open powershell first. When I type these commands directly into the command line it works the way it should but when I run it through the python script it gives this </p>
  
  <pre><code>&lt;bound method Popen.communicate of &lt;subprocess.Popen object at 0x00000000026E4A90&gt;&gt;
  </code></pre>
  
  <p>which is an improvement I guess but not the "Hello world" I was expecting. 
  I have no idea what I should try to do next to get this to work. Any help would be greatly appreciated</p>
  
  <p>Also if the powershell script I am using is needed here it is </p>
  
  <pre><code>$strString = "Hello World"
  write-host $strString
  
  function ftest{
  $test = "Test"
  write-host $test
  }
  </code></pre>
  
  <p>EDIT: I tried upgrading to python 3.3 like was suggested in the first answer but I still can't get it to work. I used the command <code>p = subprocess.Popen(['powershell.exe', "C:\\Users\\gu2124\\Desktop\\helloworld.ps1"], stdout=sys.stdout)</code> and am sure the file is there but am getting this error:</p>
  
  <pre><code>Traceback (most recent call last):
    File "&lt;pyshell#3&gt;", line 1, in &lt;module&gt;
      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 
  </code></pre>