web-dev-qa-db-ja.com

pythonスクリプト内でpowershellスクリプトを実行する、python実行中にPowerShellの出力を出力する方法

私はpythonスクリプトを記述しています。これは、さまざまな条件をチェックし、それに応じてPowerShellスクリプトを実行して、Windowsからの移行を自動化するのに役立ちますXP Windows 7へ。Powershellスクリプトは、何が起こっているかについてユーザーに更新を与える独自の出力です。私はpowershellスクリプトの出力を取得し、それをpythonスクリプトの出力として出力します。いくつかの質問を見回しました同じことをしたいようですが、彼らは私のために働いているようではありません。

_import subprocess
subprocess.call(["C:\Users\gu2124\Desktop\helloworld.ps1"])
_

ここで提案されたように Python script からPowerShell関数を実行します)が、これはプログラムが最初に実行されるのを待機し、出力を提供しないことがわかりました。ここで推奨されているようにsubprocess.Popen()を使用するには Popenを使用してPythonでPowershellスクリプトを実行します。Powershellスクリプトの出力を取得してWebページに更新するにはどうすればよいですか? なので、これを試しました

_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へのアップグレードを試みましたが、最初の回答で提案されたように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 
_
15
user3282276
  1. Powershellスクリプトを実行できることを確認します(デフォルトでは無効になっています)。おそらくあなたはすでにこれを行っています。 http://technet.Microsoft.com/en-us/library/ee176949.aspx

    Set-ExecutionPolicy RemoteSigned
    
  2. これを実行するpythonスクリプトをpowershellスクリプトで実行する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
19
NuclearPeon

Python 2.7がインストールされていませんが、Python 3.3でPopenstdoutに設定してsys.stdoutは問題なく動作しましたが、パスのバックスラッシュをエスケープする前ではありませんでした。

>>> import subprocess
>>> import sys
>>> p = subprocess.Popen(['powershell.exe', 'C:\\Temp\\test.ps1'], stdout=sys.stdout)
>>> Hello World
_
1
Ansgar Wiechers