私は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
_
Powershellスクリプトを実行できることを確認します(デフォルトでは無効になっています)。おそらくあなたはすでにこれを行っています。 http://technet.Microsoft.com/en-us/library/ee176949.aspx
Set-ExecutionPolicy RemoteSigned
これを実行する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
Python 2.7がインストールされていませんが、Python 3.3でPopen
をstdout
に設定してsys.stdout
は問題なく動作しましたが、パスのバックスラッシュをエスケープする前ではありませんでした。
>>> import subprocess
>>> import sys
>>> p = subprocess.Popen(['powershell.exe', 'C:\\Temp\\test.ps1'], stdout=sys.stdout)
>>> Hello World
_