あなたのために1つを手に入れました...
Pythonを使用して、Pythonコード内からPowershellスクリプトを呼び出していsubprocess.Popen
ます。終了するために、最初の入力パラメーターと、最後に「Enter」を必要とするPowershellスクリプトが1つあります。これは私にいくつかの問題を与えています。Powershellコードは次のようになります。
$usrFileName = read-host "Please enter a file name to save the report"
*does some computering*
*creates some output* #ideally looking to capture this to output, but not the main problem
#display task complete to user
Read-Host -Prompt "Press Enter to exit" #This is problematic - don't know how to end this
Pythonコード:
from tkinter import *
import os, datetime
import subprocess
from subprocess import Popen, PIPE
from keyboard import press_and_release
window = Tk()
window.title( 'PowerShell Script' )
frame = Frame(window)
fldrPath = r"C:/Users/paul.sisson/Downloads/Powershell Development/Monthly PMs PowerShell scans/BLDG-7UP-SUNY-Scans/7UP-LAB-A-325/"
listbox = Listbox(frame)
listbox.configure(width=50)
# Get todays date and add the lab name to be piped later
today = (datetime.datetime.now().strftime('%d%b%Y')).upper()
usrFileName = today + "-7UP-A-325"
for name in os.listdir(fldrPath):
listbox.insert('end', name)
def selection():
fileList = listbox.curselection()
for file in fileList:
keyword = 'Scans'
os.chdir(fldrPath)
proc = subprocess.Popen(["powershell.exe", '-File', fldrPath + '\\' + listbox.get(file)], bufsize=0,
universal_newlines=1, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
#proc.stdin.write(usrFileName) works to name file, but then deadlocks
while proc.poll() is None:
p = proc.stdout.readline()
output.insert('end', p)
output.update()
output = Text(window, width=75, height=6, wrap=WORD, background="white")
btn = Button(frame, text='Run Script', command=selection)
btn.pack(side=RIGHT, padx=5)
listbox.pack(side=LEFT)
frame.pack(padx=30, pady=30)
output.pack(fill=BOTH, expand=1, padx=5, pady=5)
window.mainloop()
を使用して入力を正常に渡しましたが、proc.stdin.write(usrFileName)
それが適切な方法ではないのではないかと心配しています。私が読み取りと書き込みをしたいという事実を考えると、プロセスがデッドロックするリスクを冒したくありません。これはかなり確実に起こっていることです。
いくつかのスレッドに基づいて、他のいくつかの例を試しました。
proc = subprocess.Popen(["powershell.exe", '-File', fldrPath + '\\' + listbox.get(file),'-usrFileName:',
propername], bufsize=0, universal_newlines=1,
stdout=subprocess.PIPE, stdin=subprocess.PIPE)
一緒に行ったsubprocess.call
一度か二度、私はそれが動作しませんので、出力用proc.pollを使用する必要があります。
keyboard
エンターを修正するために持ち込んだことがわかりますが、そこに到達する前にコードがハングするため、それが進むべき道かどうかはわかりません。
簡単usrFileName
に言うと、最初にPowershellに正しく書き込み、Powershellからの出力を読み取り、最後に「Enterキーを押す」を実行するためのガイダンスを探しています。
stdin
子プロセスがハングしなくなるように、明示的に閉じる必要がありますか?
私.communicate()
は、スレッドが進むべき道だと感じていますが、道を教えてくれる優雅な人が必要です!
サポートに感謝します。
PS Powershellを変更することはオプションではなく、私のコードではなく、すでに配置されているものを操作しようとするだけです。ありがとう!
Read-Host
stdinを介して対話型プロンプトに応答するには、各応答を改行で終了する必要があります。
したがって、stdin入力を2つの改行で終了します。1つはファイル名プロンプトに応答し、もう1つは終了プロンプトに応答します。
proc.stdin.write(usrFileName + '\n\n')
注:PowerShellのstdout出力には、プロンプトメッセージと送信された応答も含まれるため、出力を解析するときにそれを考慮する必要があります。具体的には、stdout出力には、
Please enter a file name to save the report: 10Sep2020--7UP-A-325
(たとえば)Press Enter to exit:
、、および追加の空行が含まれます。これは、終了プロンプトのRead-Host
ステートメントの出力が変数にキャプチャされないため、暗黙的に出力されるためです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加