2010-06-05 17 views
2

Je ne pensais pas que ce serait aussi difficile que cela s'est avéré être, mais je suis ici. J'essaie d'écrire un script Nautilus en Python pour télécharger une ou plusieurs images sur Imgur en sélectionnant et en cliquant dessus avec le bouton droit de la souris. Cela fonctionne assez bien avec des images simples et des images multiples - tant qu'elles ne contiennent aucun espace. En fait, vous pouvez télécharger une seule image contenant des espaces, mais pas plusieurs.Échapper des espaces dans les chemins en utilisant le script nautilus

Le problème est que NAUTILUS_SCRIPT_SELECTED_FILE_PATHS renvoie tous les fichiers et répertoires sélectionnés en tant que chaîne séparée par des espaces. Ainsi, par exemple, il pourrait ressembler à ceci:

print os.environment['NAUTILUS_SCRIPT_SELECTED_FILE_PATHS'] 
/home/nevon/Desktop/test image.png /home/nevon/Desktop/test.jpg 

Ce que je besoin est un moyen de -soit en bash ou Python- échapper aux espaces dans le chemin - mais pas les espaces qui délimitent les différents éléments. Soit cela, ou un moyen de mettre des guillemets autour de chaque élément.

La solution ultime serait si je pouvais le faire dans bash et ensuite envoyer les éléments en tant qu'arguments séparés à mon script python. Quelque chose comme:

python uploader.py /home/nevon/Desktop/test\ image.png /home/nevon/Desktop/test.jpg 

J'ai essayé RTFM'ing, mais il ne semble pas y avoir beaucoup de bonnes solutions pour cela. Au moins pas que j'ai trouvé. Des idées?

+0

'python uploader.py '... test image.png' ...' mais cela appartient à superuser.com – msw

+0

ou un test image 'mv 'test image.png'. png'. Oui, vous pouvez utiliser des espaces dans les noms de fichiers, mais personne n'a dit que ce serait amusant en toutes circonstances. – msw

+0

Je sais que vous pouvez citer les arguments pour autoriser les espaces, mais comment ferais-je cela quand $ NAUTILUS_SCRIPT_SELECTED_FILE_PATHS me donne juste une liste délimitée par des espaces? –

Répondre

1

I pense que $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS doit être délimité par des retours à la ligne, et non par des espaces. Dans ce cas, ce qui suit devrait fonctionner de bash:

echo -e $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS | xargs python uploader.py 
+0

C'est ce que j'ai lu aussi, mais voici la sortie que je reçois de echo -e $ NAUTILUS_SCRIPT_SELECTED_FILE_PATHS> sortie /home/nevon/Bureau/test image.png /home/nevon/Desktop/test.gif –

+0

Eh, je Devinez les commentaires ne permettent pas de paragraphes. Quoi qu'il en soit, malgré ce que les docs disent, c'est une liste délimitée par des espaces. Votre suggestion n'a pas fonctionné, malheureusement. –

+0

Je signale ceci comme correct. Au début, cela n'a pas fonctionné, mais maintenant tout à coup, ça marche. Je ne suis pas sûr de ce que j'ai fait de mal la première fois, mais ça marche maintenant. J'ai dû faire: echo -e $ NAUTILUS_SCRIPT_SELECTED_FILE_PATHS | xargs --delimiter = "\ n" python uploader.py Mais maintenant ça marche! –

0

Je ne peux pas tester ce que je suis à une machine Windows, mais vous avez essayé d'utiliser NAUTILUS_SCRIPT_SELECTED_FILE_URIS $ au lieu? Ensuite, en python, vous pouvez obtenir les chemins avec quelque chose comme:

[f.strip() for f in os.environment['NAUTILUS_SCRIPT_SELECTED_FILE_URIS'].split('file://') if len(f) > 0] 
1

Skipping un niveau d'évaluation montre que la documentation nautilus est incomplète et qu'il ya une meilleure façon beaucoup moins sujet à qui-sait-comment-plusieurs niveaux d'interprétation. Nautilus passe les fichiers sélectionnés comme arguments de script:

$ cat ~/.gnome2/nautilus-scripts/arguments.sh 
#!/bin/sh 
rm -f /tmp/arguments.* 
outf=/tmp/arguments.$$ 
echo "$0: $#" > $outf 
while [ $# -gt 0 ] ; do 
    echo "$1" 
    if [ ! -r $1 ] ; then echo "cwd is not correct"; fi 
    shift 
done >> $outf 
echo paths $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS >> $outf 
for i in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS ; do 
    echo "+$i+" 
done >> $outf 

J'ai envoyé la sortie à /tmp puisque je ne voulais pas chasser pour le stdout. Étant donné:

$ ls -1 
a 
b 
c with space 
d 
e with space 
g 

Sélectionner tous les fichiers dans le répertoire et Scripts-> donne des arguments.sh:

$ cat /tmp/arguments.20447 
/home/msw/.gnome2/nautilus-scripts/arguments.sh: 6 
a 
b 
c with space 
d 
e with space 
g 
paths /home/msw/junk/a /home/msw/junk/b /home/msw/junk/c with space 
    /home/msw/junk/d /home/msw/junk/e with space 
    /home/msw/junk/g 
+/home/msw/junk/a+ 
+/home/msw/junk/b+ 
+/home/msw/junk/c+ 
+with+ 
+space+ 
+/home/msw/junk/d+ 
+/home/msw/junk/e+ 
+with+ 
+space+ 
+/home/msw/junk/g+ 

aurais-je pu cités $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS pour éviter cela? Sûr. Je n'ai pas démontré que le nombre de niveaux d'interpolation avec la variable est discutable, mais argv reste non pollué.

Utilisez argv (ou sys.argv en Python) et sauvez des maux de tête. Aussi la sémantique documentée de l'environnement variables is weird.

0

Il s'avère que echo transforme parfois les nouvelles lignes de variables en espaces. Ce qui suit devrait fonctionner:

echo -e "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" | xargs python uploader.py