Popenを使用してPython変数をPowershellパラメーターに渡す

ポール・シッソン

あなたのために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を変更することはオプションではなく、私のコードではなく、すでに配置されているものを操作しようとするだけです。ありがとう!

mklement0

Read-Hoststdinを介して対話型プロンプトに応答するには、各応答を改行で終了する必要があります

したがって、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]

編集
0

コメントを追加

0

関連記事

分類Dev

Powershellでスイッチパラメーターとして変数を渡す

分類Dev

HTMLonClickを使用してPHP変数をパラメーターとして渡す

分類Dev

Ansibleを使用してパラメーターのリストをPowershellに渡す

分類Dev

パラメータとして関数を渡すPowerShell

分類Dev

jquery変数をパラメーターとしてphp関数に渡す

分類Dev

Pythonは変数を関数パラメーターに渡します

分類Dev

HTMLで変数をパラメーターとして渡す

分類Dev

変数をパラメーターとして渡す

分類Dev

ボタンを使用して関数にパラメーターを渡す方法

分類Dev

ボタンを使用して関数にパラメーターを渡す方法

分類Dev

Bash変数を使用して一連のパラメーターをプログラムに渡す

分類Dev

Python:関数を介してパラメーターを渡す

分類Dev

asp:Buttonを使用してパラメーターを関数に渡します

分類Dev

AJAXを使用してPHP関数にパラメーターを渡します

分類Dev

addEventListenerを使用して関数にパラメーターを渡す方法は?

分類Dev

URLを使用して関数にパラメーターを渡す

分類Dev

Nodejsを使用してCloudFormation関数にパラメーターを渡す

分類Dev

関数パラメーターを使用して、それをlm式に渡す

分類Dev

ループを使用して関数にパラメータを渡す

分類Dev

変数Powershellでパラメーターを渡す

分類Dev

文字列変数をパラメータとしてawkに渡す方法

分類Dev

DIを使用してDbContextにパラメーターを渡す

分類Dev

変数を使用してクラスを作成するか、変数をパラメータとしてメソッドに渡す

分類Dev

Jythonを使用してJavaからPythonにパラメーターを渡す

分類Dev

Pythonを使用してFlaskのモデルにパラメーターを渡す

分類Dev

メソッドにパラメーターとして渡されたクラスタイプを使用してローカル変数を定義する方法

分類Dev

powershell.exe を介してパラメーターを渡す

分類Dev

Pythonサブプロセスにパラメーターを渡す。Popen

分類Dev

PowerShellを介して複数のクエリパラメーターをWebServiceに渡します

Related 関連記事

  1. 1

    Powershellでスイッチパラメーターとして変数を渡す

  2. 2

    HTMLonClickを使用してPHP変数をパラメーターとして渡す

  3. 3

    Ansibleを使用してパラメーターのリストをPowershellに渡す

  4. 4

    パラメータとして関数を渡すPowerShell

  5. 5

    jquery変数をパラメーターとしてphp関数に渡す

  6. 6

    Pythonは変数を関数パラメーターに渡します

  7. 7

    HTMLで変数をパラメーターとして渡す

  8. 8

    変数をパラメーターとして渡す

  9. 9

    ボタンを使用して関数にパラメーターを渡す方法

  10. 10

    ボタンを使用して関数にパラメーターを渡す方法

  11. 11

    Bash変数を使用して一連のパラメーターをプログラムに渡す

  12. 12

    Python:関数を介してパラメーターを渡す

  13. 13

    asp:Buttonを使用してパラメーターを関数に渡します

  14. 14

    AJAXを使用してPHP関数にパラメーターを渡します

  15. 15

    addEventListenerを使用して関数にパラメーターを渡す方法は?

  16. 16

    URLを使用して関数にパラメーターを渡す

  17. 17

    Nodejsを使用してCloudFormation関数にパラメーターを渡す

  18. 18

    関数パラメーターを使用して、それをlm式に渡す

  19. 19

    ループを使用して関数にパラメータを渡す

  20. 20

    変数Powershellでパラメーターを渡す

  21. 21

    文字列変数をパラメータとしてawkに渡す方法

  22. 22

    DIを使用してDbContextにパラメーターを渡す

  23. 23

    変数を使用してクラスを作成するか、変数をパラメータとしてメソッドに渡す

  24. 24

    Jythonを使用してJavaからPythonにパラメーターを渡す

  25. 25

    Pythonを使用してFlaskのモデルにパラメーターを渡す

  26. 26

    メソッドにパラメーターとして渡されたクラスタイプを使用してローカル変数を定義する方法

  27. 27

    powershell.exe を介してパラメーターを渡す

  28. 28

    Pythonサブプロセスにパラメーターを渡す。Popen

  29. 29

    PowerShellを介して複数のクエリパラメーターをWebServiceに渡します

ホットタグ

アーカイブ