Běží skript, pomocí Podproces v Pythonu není produkovat výstup

0

Otázka

Snažím se spustit skript, pomocí Python pomocí podproces.Popen().

Skript má následující řádky:

#!/bin/sh
echo Hello World

Následující Python kód:

print("RUNNNING SHELL SCRIPT NOW")
shellscript = subprocess.Popen(['km/example/example1/source/test.sh'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
shellscript.wait()

for line in shellscript.stdout.readlines():
    print(line)
print("SHELL SCRIPT RUN ENDED")

Nicméně, na běh, já jsem jen dostat se na následující výstup:

RUNNNING SHELL SCRIPT NOW
SHELL SCRIPT RUN ENDED

tedy nebudu se shell skript výstup mezi těmito 2 řádky.

Navíc, když jsem se odstranit stderr=subprocess.PIPE část z subproces, jsem se následující výstup:

RUNNNING SHELL SCRIPT NOW
'km' is not defined as an internal or external command.
SHELL SCRIPT RUN ENDED

Nejsem schopen pochopit, jak vyřešit tento problém a spustit skript správně. Laskavě průvodce. Díky.

AKTUALIZACE:

Zkoušel jsem i následující změnu:

print("RUNNNING SHELL SCRIPT NOW")
shellscript = subprocess.Popen(['km/example/example1/source/test.sh'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

out, err = shellscript.communicate()
print(out)
print("SHELL SCRIPT RUN ENDED")

Mám následující výstup:

RUNNNING SHELL SCRIPT NOW
b''
SHELL SCRIPT RUN ENDED

python sh shell subprocess
2021-11-23 06:12:41
1

Nejlepší odpověď

2

Jednoduché a přímočaré opravit je nelze použít holé Popen pro tohle.

Můžete také nemusíte shell spustit podproces; pokud podproces je shell skript, který podproces sám bude shell, ale nebudete potřebovat pomoc shell spustit ten script.

proc = subprocess.run(
    ['km/example/example1/source/test.sh'],
    check=True, capture_output=True, text=True)
out = proc.stdout

Pokud opravdu potřebujete používat Popen, musíte pochopit jeho zpracování modelu. Ale pokud jste jen snaží získat práci, odpověď je jednoduchá, nepoužívejte Popen.

Chybová zpráva skutečně vypadá, jako byste se na Windows a snaží se spustit km via cmd který si myslí, že lomítka jsou možnost separátory, ne oddělovače adresáře. Odstranění shell=True vyhýbá se tato komplikace, a začne proces s požadovaným jménem. (To samozřejmě stále vyžaduje, že soubor existuje v relativní název souboru jste uvedli. Možná uvidíme také , Co přesně je aktuální pracovní adresář? a také možná přepnout na nativní Windows zpětná lomítka, s r'...' řetězec, aby se zabránilo Python snaží interpretovat zpětná lomítka.)

2021-11-23 09:31:37

Děkuji za odpověď. Ano-opravdu nemám potřebu používat Popen. Ano, jsem na Windows. Když jsem se spustit svůj fragment kódu, jsem si OSError: [WinError 193] %1 není platná aplikace typu Win32 Co to souviset?
eraisedtothepowerx

Pokud km/example/example1/source/test.sh není platná aplikace systému Windows, to by bylo vysvětlení. Nevím, jak byste očekávat, že shell skripty pro práci na Cygwin; možná explicitně spustit s ['/bin/sh', 'km/example/example1/source/test.sh']?
tripleee

Musel jsem si stanovit kompletní cestu od Disku. Nicméně, když skript běží, terminálové okno otevřít jen na sekundu zobrazuje výstup a zavře sama. Existuje způsob, jak zobrazit výstup na Pycharm terminálu místo, tak že to tam zůstane?
eraisedtothepowerx

Žádné zkušenosti s PyCharm a jen velmi málo z Python na Windows, ale to zní, jako společný ČKD. Položit nový dotaz, pokud nemůžete najít to již odpověděl.
tripleee

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................