2

我不认为这会像结果那样棘手,但我在这里。我正在尝试用 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'ing,但似乎没有很多好的解决方案。至少我没有找到。有任何想法吗?

4

4 回答 4

2

跳过一个级别的评估表明 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 产生:

$ 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 中)并省去一些麻烦。环境变量的记录语义也很奇怪。

于 2010-06-05T14:18:39.473 回答
1

认为应该$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS用换行符分隔,而不是用空格分隔。在这种情况下,以下内容应该适用于 bash:

echo -e $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS | xargs python uploader.py 
于 2010-06-05T12:22:06.023 回答
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]
于 2010-06-05T12:47:10.357 回答
0

事实证明,echo有时将变量中的换行符变成空格。以下应该有效:

echo -e "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" | xargs python uploader.py
于 2013-02-18T09:14:59.537 回答