2015-04-20 3 views
8

Próbuję wywołać skrypt skorupowy za pomocą modułu podprocesu w Pythonie 2.6.Podproces w Pythonie: Nazwa pliku zbyt długa

import subprocess 

shellFile = open("linksNetCdf.txt", "r") 

for row in shellFile: 
    subprocess.call([str(row)]) 

Moje nazwy plików mają długość od 400 do 430 znaków. Przy wywołaniu skryptu pojawia się błąd:

File "/usr/lib64/python2.6/subprocess.py", line 444, in call 
return Popen(*popenargs, **kwargs).wait() 
File "/usr/lib64/python2.6/subprocess.py", line 595, in __init__ 
errread, errwrite) 
File "/usr/lib64/python2.6/subprocess.py", line 1106, in _execute_child 
raise child_exception 
OSError: [Errno 36] File name too long 

przykładem linii zasięgu linksNetCdf.txt jest

./ShellScript 'Title' 'Sometehing else' 'InfoInfo' 'MoreInformation' inputfiile outputfile.txt 3 2 

Wszelkie pomysły jak nadal prowadzone skrypt?

+1

Czy u próbował dowiedzieć się, co maksymalna dopuszczalna długość nazwy pliku jest ustawiony w systemie 'getconf NAME_MAX /' – flazzarini

+1

może wyświetlić ' head' of linksNetCdf.txt –

+0

@flazzarini działa po wpisaniu "ręcznie" lub skopiowaniu linku z .txt. i wklej go do bezpiecznego klienta ssh ... – Stophface

Odpowiedz

12

subprocess.call może przyjąć polecenie uruchomienia na dwa sposoby - albo pojedynczy ciąg, który wpisujesz w powłoce, albo listę wykonywalnej nazwy, a następnie argumenty.

Chcesz pierwszy, ale były przy użyciu drugiego

import subprocess 

shellFile = open("linksNetCdf.txt", "r") 

for row in shellFile: 
    subprocess.call(row, shell=True) 

Poprzez przekształcenie swojej row w wykazie zawierającym pojedynczy łańcuch, mówisz coś „Uruchom komendę nazwie echo these were supposed to be arguments bez argumentów”

+0

Hm, usunąłem '[]' ale nadal otrzymuję ten sam błąd ... – Stophface

+0

Istnieją parametry w moim poleceniu Chcę uruchomić. Jose Ricardo Bustos M. wspomniał, że może to być problematyczne. – Stophface

+0

Dzięki temu parametry są w porządku. Możesz spróbować użyć 'subprocess.call (row, shell = True)' – Eric

5

Musisz podpowiedzieć podprocesowi, aby wykonać wiersz jako pełne polecenie z uwzględnieniem argumentów, a nie tylko jednego programu.

Odbywa się to poprzez przepuszczenie shell = True zadzwonić

import subprocess 
cmd = "ls " + "/tmp/ " * 30 
subprocess.call(cmd, shell=True)