2017-04-12 20 views
3

私はrestを介して取得した入力に基づいてコマンドをビルドするpythonスクリプトを持っています。 コマンドはプリントアウトされ、コピーされてpowershellに貼り付けられたときに機能します。 私の質問は、実際にコマンドを実行させる方法です。pythonでコマンドを書いて、powershellで実行します。

これまでのところ私は、同じディレクトリ内のファイルにコマンドを書き込み、そのように動作して試してみました:

import subprocess, sys 
p = subprocess.Popen(["powershell.exe", "test.ps1"],stdout=sys.stdout) 
p.communicate() 

しかし、私はエラーを取得する:

Traceback (most recent call last): File "C:/Users/pschaefer/src/python/executePowerShell.py", line 2, in p = subprocess.Popen(["powershell.exe", "test.ps1"],stdout=sys.stdout) File "C:\Python27\lib\subprocess.py", line 703, in init errread, errwrite), to_close = self._get_handles(stdin, stdout, stderr) File "C:\Python27\lib\subprocess.py", line 850, in _get_handles c2pwrite = msvcrt.get_osfhandle(stdout.fileno()) UnsupportedOperation: fileno

更新

を削除する,stdout=sys.stdout1は以前のエラーを取り除き、今すぐ表示されます

test.ps1 cannot be loaded because running \r\nscripts is disabled on this system.

私は".\\test.ps1 Set-ExecutionPolicy -ExecutionPolicy unrestricted"にコマンドを切り替えてみましたが、まだ問題があります。

また、.ps1ファイルを作成する代わりに、コマンドを文字列としてビルドし、それを1つずつビルドすることも可能ですか?それを理解できる人なら誰でも大歓迎です!

+1

'stdout = sys.stdout'はデフォルトです。 'os.system()'だけで試しましたか?または 'subprocess.check_call()'? –

+0

ああ、 'stdout = sys.stdout'を削除すると、私はPythonシェルで見られるエラーを止めてしまいましたが、そこにはエラーが表示されたpowershellウィンドウのポップアップが表示されますが、私はそれを捕まえられません。私はps1ファイルに追加することができます閉鎖からそれを停止する方法に関する任意のアイデア?申し訳ありませんが、ここpowershellのnoobは –

+0

IDEから実行しないでください。標準コンソールから実行してください。 –

答えて

1

スクリプトを実行しているマシンでpowershellスクリプトを実行できるようにしていますか? Set-ExecutionPolicyコマンドレットを使用してこれを設定するか、または-ExecutionPolicy Bypassパラメーターを渡して、低い権限でスクリプトを実行することができます。

+0

これは問題のないpowershellで結果のps1ファイルを直接実行することができるかもしれません。 Set-ExecutionPolicyコマンドを実行しましたが、このシステムで\ r \ nscriptsの実行が無効になっているため、「test.ps1をロードできません」というエラーが表示されます。 Pythonスクリプトを実行しようとしたとき –

+0

-Executionpolicy Bypassフラグを自分のものと一緒に渡してみてください。ps1ファイル名 – PrestonM

+0

PowerShellのx64とx86バージョンの両方でコマンドを実行して、実行する必要があることに注意してください。 –

1

IDEはstdoutを独自のストリームにリダイレクトするため、このようなスクリプトをIDEから実行することはできません。これはほとんどの場合、ほとんどの場合filenoをサポートしていません。

実際のシステムシェルでこれらのコマンドを実行することもできます。

シェル& IDEはstdout=sys.stdoutを削除することですが、あなたはより良いエラーメッセージを取得したり、出力を取得、またはことができないの両方で動作します回避策:

import subprocess, sys 
p = subprocess.Popen(["powershell.exe", "test.ps1"],stdout=subprocess.PIPE,stderr=subprocess.PIPE) 
out,err = p.communicate() 
print(out,err) 
Popen機能を使用して、出力/エラーストリームをリダイレクト test.ps1が存在しないため、私のマシン上の

が存在しないため、わかりやすいpowershellエラーメッセージが表示されます。

EDIT:実際のエラーメッセージが表示された質問の編集に私の答えが反映されません。このQ & Aはあなたを助けるかもしれません:PowerShell says "execution of scripts is disabled on this system."

+0

あなたのスクリプト(Pythonシェルで)にはエラーが表示されます: "このシステムで\ r \ nscriptsの実行が無効になっているため、test.ps1を読み込めません。" 私がpoweshellでスクリプトを直接実行すると、すばやいポップアップが消えてしまいます。 powershellでps1ファイルだけを実行すると、期待通りに動作しますか? –

+0

私はこれを発見しました:http://stackoverflow.com/questions/4037939/powershell-says-execution-of-scripts-is-disabled-on-this-system –

関連する問題