subprocess.Popen ? 2 rozne skrypty i przesylanie argumentow do funkcji + pipe'y

0

jak zrobic cos takiego (w windowsie, w spyderze, python 2.7) :

skrpyt2.py zawiera kilka funkcji

skrypt1.py tworzy subproces i uruchamia jedna z funkcji ze skryptu skrypt1.py oraz przesyla jakies argumenty, ktore ta funkcja ma obliczyc i zwrocic.
zgodnie z helpem probuje nastepujaco, ale to nie dziala:

skrypt1.py

import subprocess
import skrypt1.funkcja_cos_obliczajaca

p = subprocess.Popen(["python", "skrypt2.funkcja_cos_obliczajaca.py"])
# teraz chce przeslac argument tyou string do tego procesu

p.communicate('jakis string')

skrypt2.py


import sys

def jakas_funkcja_cos_obliczajaca(s):
    return wynik

if __name__== '__main__':
    jakas_funkcja_cos_obliczajaca(sys.argv[1])

powyzsze nie dziala. dlaczego i jak sie robi, aby zadzialalo, a moze moje podejscie jest zle i to trzeba robic w 1 pliku ?
jak sie komunikowac zeby skrypt1 otrzymal wynik za pomoca pipe'a ?

0
from multiprocessing import Process
from skrypt1 import funkcja

if __name__ == '__main__':
    p = Process(target=funkcja, args=('Jakiś string',))
    p.start()
    p.join()

Subprocess nie służy do wykonywania funkcji Pythonowych, ale poleceń systemowych.

Jeśli natomiast nie zależy Tobie na asynchronicznym wykonaniu, to starczy zwykłe funkcja('jakiś string')

0
enedil napisał(a):
from multiprocessing import Process
from skrypt1 import funkcja

if __name__ == '__main__':
    p = Process(target=funkcja, args=('Jakiś string',))
    p.start()
    p.join()

Subprocess nie służy do wykonywania funkcji Pythonowych, ale poleceń systemowych.

Jeśli natomiast nie zależy Tobie na asynchronicznym wykonaniu, to starczy zwykłe funkcja('jakiś string')

hmm.. nie dziala, tzn funkcja ze skryptu1 jest zakonczone returnem rezultatu ale po odpaleniu twojego kodu nic nie zwraca mi na konsole.

0
Pytonista beginner napisał(a):
enedil napisał(a):
from multiprocessing import Process
from skrypt1 import funkcja

if __name__ == '__main__':
    p = Process(target=funkcja, args=('Jakiś string',))
    p.start()
    p.join()

Subprocess nie służy do wykonywania funkcji Pythonowych, ale poleceń systemowych.

Jeśli natomiast nie zależy Tobie na asynchronicznym wykonaniu, to starczy zwykłe funkcja('jakiś string')

hmm.. nie dziala, tzn funkcja ze skryptu1 jest zakonczone returnem rezultatu ale po odpaleniu twojego kodu nic nie zwraca mi na konsole.

dobra, a teraz z innej beczki.
musze uzyc do tego modulu subprocess i nie interesuja mnie moduly multiprocessing, metody threading ani pool
generalnie subprocessem mozesz stwarzac child processy i je zabijac, dodatkowo moze sie komunikowac z childami za pomoca pipeow, sprawdzac czy child process juz jest zabity, itd i tego chce wlasnie.

0

W takim razie robisz to źle bo sys.argv to parametry wywołania programu a nie jego STDIN. Więc musiałbyś to odpalic jako subprocess.Popen(["python", "skrypt2.funkcja_cos_obliczajaca.py", "parametr"]) albo alternatywnie przerobić ten drugi kod tak żeby pobierał parametr przez raw_input() a nie z sys.argv

0

To tak jakbyś w bashu wykonywał python skrypt1.funkcja.py, nie ma prawa zadziałać. Nie importuj, tylko napisz taki kod w skrypt1:

if __name__ == '__main__':
    funkcja(raw_input())

Potem uruchom jako python -m skrypt1.

1 użytkowników online, w tym zalogowanych: 0, gości: 1