我不认为这会像原来那样棘手,但我在这里。我正在尝试用Python编写Nautilus脚本,只需选择并右击它们就可以将一个或多个图像上传到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,但似乎没有很多好的解决方案。至少不是我发现的。有什么想法吗?
答案 0 :(得分:1)
我认为 $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
应该是换行符分隔符,而不是空格分隔符。在这种情况下,以下内容应该来自bash:
echo -e $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS | xargs python uploader.py
答案 1 :(得分:1)
跳过一个级别的评估表明,nautilus文档是不完整的,并且有一种更好的方式,更不用说谁知道多少级别的解释。 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
因为我不想寻找标准输出。给出:
$ ls -1
a
b
c with space
d
e with space
g
选择目录中的所有文件和Scripts-> arguments.sh yield:
$ 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
保持不受干扰。
在Python中使用argv(或sys.argv
)并省去一些麻烦。还记录了环境variables is weird的语义。
答案 2 :(得分:0)
我无法测试这个,因为我在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]
答案 3 :(得分:0)
事实证明,echo
有时会将变量中的换行符转换为空格。以下应该有效:
echo -e "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" | xargs python uploader.py