Избегайте пробелов в путях, используя скрипт nautilus - PullRequest
2 голосов
/ 05 июня 2010

Я не думал, что это будет так сложно, как оказалось, но я здесь. Я пытаюсь написать скрипт Nautilus на Python для загрузки одного или нескольких изображений в Imgur, просто выбрав и щелкнув по ним правой кнопкой мыши. Он работает достаточно хорошо как с одиночными изображениями, так и с несколькими изображениями - при условии, что они не содержат пробелов. Фактически, вы можете загрузить одно изображение, содержащее пробелы, но не несколько.

Проблема в том, что NAUTILUS_SCRIPT_SELECTED_FILE_PATHS возвращает все выбранные файлы и каталоги в виде строки, разделенной пробелами. Так, например, это может выглядеть так:

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

Мне нужен способ - либо в bash, либо в Python - экранировать пробелы в пути - но не пробелы, которые разделяют разные элементы. Или это, или способ поставить кавычки вокруг каждого элемента.

Окончательное решение было бы, если бы я мог сделать это в bash и затем отправить элементы в качестве отдельных аргументов в мой скрипт на python. Что-то вроде:

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

Я пробовал RTFM'ing, но, кажется, не очень много хороших решений для этого. По крайней мере, не то, что я нашел. Есть идеи?

Ответы [ 4 ]

1 голос
/ 05 июня 2010

Пропуск одного уровня оценки показывает, что документация по nautilus неполна и что есть лучший способ гораздо меньше подвергаться интерпретации «кто знает сколько». Наутилус передает выбранные файлы в качестве аргументов скрипта:

$ 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

Я отправил вывод на /tmp, так как не хотел охотиться за stdout. Дано:

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

Выберите все файлы в каталоге и Scripts-> 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+

Могу ли я процитировать $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS, чтобы избежать этого? Конечно. Я не продемонстрировал, сколько уровней интерполяции с переменной сомнительно, но argv остается без изменений.

Используйте argv (или sys.argv в Python) и сохраните головную боль. Также документированная семантика переменных среды странная .

1 голос
/ 05 июня 2010

I думаю , что $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS должен быть разделен новой строкой, а не пробелом. В этом случае из bash должно работать следующее:

echo -e $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS | xargs python uploader.py 
0 голосов
/ 18 февраля 2013

Оказывается, echo иногда превращает новые строки в переменных в пробелы Должно работать следующее:

echo -e "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" | xargs python uploader.py
0 голосов
/ 05 июня 2010

Я не могу проверить это, потому что я на машине с Windows, но вы пытались использовать вместо этого $ NAUTILUS_SCRIPT_SELECTED_FILE_URIS? Затем в python вы можете получить пути с чем-то вроде:

[f.strip() for f in os.environment['NAUTILUS_SCRIPT_SELECTED_FILE_URIS'].split('file://') if len(f) > 0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...