2015-03-26 2 views
0

J'appelle mencoder d'une fonction python (2.7.3) avec subprocess.call (J'utilise ipython), mais il ne fonctionne pas, alors quand je copier et coller la commande sur le terminal shell il fait. Je pense que je fais une erreur stupide avec des cordes. Je suis très confus parce que je cours cette fonction python sur deux clusters de calcul distincts, avec la même version python, mais la version différente de mencoder, et cette commande fonctionne sur un cluster mais pas sur l'autre.python: appeler commande shell avec subprocess

c'est le script python

base = r'/home/afylot/pics/' 
var = r'b2component' 
os.chdir(base) 
listdir = [x[0] for x in os.walk('.')][1:-1] 
listdir.reverse() 
dirs = ','.join(listdir) 
dirs2=dirs.replace(r"./z",r"") 
def cmd2(x): return r"mencoder mf://z{"+dirs2+"}/"+x+r".png -mf fps=1 -ovc lavc -o "+x+r"_mpeg4.avi" 
def cmd3(x): return r"mencoder -speed 1/4 "+x+r"_mpeg4.avi -ovc copy -nosound -o "+x+r"_smpeg4.avi" 
res2=subprocess.call([cmd2(var)],shell=True) 
res3=subprocess.call([cmd3(var)],shell=True) 

et c'est le message d'erreur:

MEncoder SVN-r37381-4.6 (C) 2000-2015 MPlayer Team 
success: format: 16 data: 0x0 - 0x0 
MF file format detected. 
[mf] filelist: z{5.056,4.996,4.936,4.877,4.819,4.762,4.705,4.648,4.592,4.537,4.482,4.428,4.374,4.321,4.268,4.216,4.164,4.113,4.063,4.012,3.963,3.914,3.865,3.817,3.769,3.722,3.675,3.629,3.583,3.538,3.493,3.448,3.404,3.361,3.317,3.275,3.232,3.190,3.149,3.108,3.067,3.027,2.987,2.909,2.870,2.832,2.794,2.756,2.719,2.682,2.646,2.609,2.574,2.538,2.503,2.469,2.434,2.400,2.367,2.333,2.300,2.268,2.235,2.203,2.171,2.140,2.109,2.078,2.048}/b2component.png 
[mf] number of files: 0 
Segmentation fault (core dumped) 
MEncoder SVN-r37381-4.6 (C) 2000-2015 MPlayer Team 
File not found: 'b2component_mpeg4.avi' 
Failed to open b2component_mpeg4.avi. 
Cannot open file/device. 

Exiting... 

Sur l'autre groupe la commande à partir de la fonction fonctionne python. Si, sur le même cluster, je tente de lancer la commande du terminal, il fonctionne également

mencoder mf://z{5.056,4.996,4.936,4.877,4.819,4.762,4.705,4.648,4.592,4.537,4.482,4.428,4.374,4.321,4.268,4.216,4.164,4.113,4.063,4.012,3.963,3.914,3.865,3.817,3.769,3.722,3.675,3.629,3.583,3.538,3.493,3.448,3.404,3.361,3.317,3.275,3.232,3.190,3.149,3.108,3.067,3.027,2.987,2.909,2.870,2.832,2.794,2.756,2.719,2.682,2.646,2.609,2.574,2.538,2.503,2.469,2.434,2.400,2.367,2.333,2.300,2.268,2.235,2.203,2.171,2.140,2.109,2.078,2.048}/b2component.png -mf fps=1 -ovc lavc -o b2component_mpeg4.avi 

Le groupe A, où la fonction échoue python, je bash 4.2.25. sur le groupe B, où la fonction python fonctionne, je suis en cours d'exécution tcsh 6.17.00


J'ai testé la même commande avec des caractères génériques (comme * et ?) et il fonctionne à partir de la fonction python. Le problème est avec les accolades {}. La chose amusante est que sur le cluster B, qui fonctionne tcsh, les caractères génériques ne fonctionnent pas, mais les accolades fonctionnent!

Quelqu'un peut-il suggérer comment surmonter cette limitation avec des accolades? parce que je veux contrôler l'ordre de dirs2 à partir de la fonction python, l'utilisation du * ne fera pas ce que je veux.

+0

Est-ce que le répertoire '/ home/afylot/photos /' existe sur les deux hôtes? –

+0

oui, aussi parce que, comme vous pouvez le voir dans le message d'erreur, dirs2 est construit correctement – simona

+0

Ah, true. Vérifiez les autorisations sur ce répertoire sur l'hôte défaillant? –

Répondre

0

le problème était le même que dans Curly Braces in python Popen , et la solution est d'utiliser

subprocess.call(cmd2(v), shell=True, executable='/bin/bash') 

car sinon shell=True fonctionne /bin/sh

+1

Je voudrais éviter 'shell = True' et passer les arguments comme une liste à la place:' call (["mencoder"] + ["mf: // {chemin}/{x} {r} .png" .format (* * vars()) pour le chemin dans listdir] + ["-mf", "fps = 1", "-ovc", "lavc", "-o", x + r + "_ mpeg4.avi"]) ' – jfs