2

これが実際ほどトリッキーになるとは思いませんでしたが、ここにいます。Python で Nautilus スクリプトを作成して、1 つ以上の画像を選択して右クリックするだけで 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 を試してみましたが、これに対する適切な解決策はあまりないようです。少なくとも私が見つけたものではありません。何か案は?

4

4 に答える 4

2

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

/tmpstdout を探したくなかったので、出力を に送信しました。与えられた:

$ 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.argvPython) を使用して、頭の痛い問題を解決してください。また、環境変数の文書化されたセマンティクスは奇妙です。

于 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

echo結局、変数の改行をスペースに変えることがあります。以下が機能するはずです。

echo -e "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" | xargs python uploader.py
于 2013-02-18T09:14:59.537 に答える
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 に答える