2011-08-22 10 views
15

Mam skrypt Pythona, który musi wywołać inny skrypt Pythona w tym samym katalogu. Zrobiłem to:przy użyciu wywołania podprocesowego python do wywołania skryptu Pythona

from subprocess import call 
    call('somescript.py') 

otrzymuję następujący błąd

call('somescript.py') 
    File "/usr/lib/python2.6/subprocess.py", line 480, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "/usr/lib/python2.6/subprocess.py", line 633, in __init__ 
    errread, errwrite) 
    File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child 
raise child_exception 

OSError: [ERRNO 2] Nie ma takiego pliku lub katalogu

mam somescript.py skryptu w tym samym folderze chociaż. Czy coś mi umyka. Dzięki

+1

Czy '.' w twojej' ŚCIEŻCE'? Czy plik wykonywalny somescript.py? – geoffspear

+1

Dlaczego próbujesz go wykonać? dlaczego nie "importować" go? – tMC

+0

@wooble tak. Jest w ścieżce i jest również wykonywalna. Tak. Mogłem też to zaimportować. Ale tak czy inaczej chciałbym wiedzieć, co robię źle tutaj, ponieważ myślę, że to ma działać. – user514946

Odpowiedz

1

subprocess.call oczekuje tych samych argumentów co subprocess.Popen - jest to lista ciągów (argv w c), a nie pojedynczy ciąg. Jest całkiem możliwe, że proces potomny próbował uruchomić "s" z parametrami "o", "m", "e" ...

0

wywołanie podprocesowe jest bardzo dosłownym wywołaniem systemowym. może być użyty do dowolnego ogólnego procesu ... stąd nie wie, co zrobić automatycznie ze skryptem Pythona.

spróbować

call ('python somescript.py') 

jeśli to nie zadziała, to może chcesz spróbować ścieżki bezwzględnej i/lub uprawnienia Sprawdź na swoim Pythona skrypt ... typowe rzeczy zabawne.

j

0

Po pierwsze, sprawdź, czy somescript.py jest wykonywalny i zaczyna się coś na wzór #!/usr/bin/python. Po wykonaniu tej czynności można użyć numeru subprocess.call('./somescript.py').

Lub inna odpowiedź wskazuje, że można zrobić subprocess.call(['python', 'somescript.py']).

+0

Po prostu losowy wskaźnik: Stwierdziłem, że użyteczne jest używanie python #!/Usr/bin/env, więc jeśli moduł został załadowany, automatycznie uruchamiasz się z załadowaną wersją pythona. – Vorticity

5

Windows? Unix?

Unix będzie potrzebował shebang i atrybut exec pracy:

#!/usr/bin/env python 

jako pierwszej linii skryptu oraz:

chmod u+x script.py 

w linii poleceń lub

call('python script.py'.split()) 

jako wspomniane wcześniej.

Windows powinien działać, jeśli dodasz shell=True parameter do połączenia "zadzwoń".

+5

'call ('python script.py')' nie działa w systemach innych niż Windows. Powinien to być 'check_call ([sys.executable lub 'python', '/ path /to/script.py'])'. I nie potrzebujesz uprawnień Shebang i wykonywalnego, jeśli określony jest plik 'python'. – jfs

+0

sys.executable powinno wystarczyć dla wszystkich rozsądnych sytuacji. –

2

Jeśli korzystasz z systemu Linux/Unix, możesz całkowicie uniknąć wywołania() i nie uruchamiać zupełnie nowej instancji pliku wykonywalnego Pythona i jego środowiska.

import os 

cpid = os.fork() 
if not cpid: 
    import somescript 
    os._exit(0) 

os.waitpid(cpid, 0) 

FWIW

+1

Tylko * nix: używając fork będziesz dziedziczył z macierzystego procesu python interpreter (ze wszystkimi istniejącymi importami, ...). Jeśli chcesz zupełnie nowego interpretatora, nie jest to dobry wybór. Zobacz wywołanie systemowe unix/fork unix. –

+0

Moduł 'subprocess' używa' fork/exec' w systemach POSIX i 'CreateProcess' w Windows. Nie musisz używać 'fork' bezpośrednio, jeśli chcesz uruchomić skrypt Pythona. – jfs

17

Jeśli „somescript.py” nie jest czymś, można normalnie wykonać bezpośrednio z linii poleceń (tj $: somescript.py działa), to nie można nazwać bezpośrednio za pomocą połączenia.

Pamiętaj, że sposób działania Popen jest taki, że pierwszym argumentem jest program, który wykonuje, a reszta to argumenty przekazane do tego programu. W tym przypadku program jest w rzeczywistości python, a nie skryptem. Więc dalej będzie działać zgodnie z oczekiwaniami:

subprocess.call(['python', 'somescript.py', somescript_arg1, somescript_val1,...]). 

to poprawnie nazywa interpreter Pythona i informuje go, aby wykonać swój skrypt z podanych argumentów.

Zauważ, że ten różni się od powyższej sugestii:

subprocess.call(['python somescript.py']) 

Że spróbuje uruchomić program o nazwie pyton somscript.py, który wyraźnie nie istnieje.

call('python somescript.py', shell=True) 

będzie również działać, ale przy użyciu ciągów jako wejście do zawinięcia jest wieloplatformowym, jest niebezpieczne, jeśli nie jesteś jednym budynku ciąg, i generalnie należy unikać, jeśli to w ogóle możliwe.

+0

Mam ten problem, ale ścieżka do skryptu znajduje się w moim pliku basrc, więc mogę wywołać go z terminala jako myscript (args). Kiedy próbuję zrobić powyższe z Pythona, pojawia się błąd nie znaleziono? – rankind

0
def main(argv): 
    host = argv[0] 
    type = argv[1] 
    val = argv[2] 

    ping = subprocess.Popen(['python ftp.py %s %s %s'%(host,type,val)],stdout = subprocess.PIPE,stderr = subprocess.PIPE,shell=True) 
    out = ping.communicate()[0] 
    output = str(out) 
    print output 
2

Sprawdź to.

from subprocess import call 
with open('directory_of_logfile/logfile.txt', 'w') as f: 
    call(['python', 'directory_of_called_python_file/called_python_file.py'], stdout=f) 
1

Co z

import sys 
from os.path import dirname, abspath 

local_dir = abspath(dirname(__file__)) 
sys.path.append(local_dir) 

import somescript 

albo jeszcze lepiej owinąć funkcjonalność w zależności, na przykład baz, to zrób to.

import sys 
from os.path import dirname, abspath 

local_dir = abspath(dirname(__file__)) 
sys.path.append(local_dir) 

import somescript 
somescript.baz() 

Nie wydaje się być dużo skryptów rozpoczęciem procesów Pythona lub rozwidlone, że wymóg?

Powiązane problemy