2011-07-19 11 views
1

Snow loepard(http://dl.dropbox.com/u/1144075/Post%20to%20Dropbox.zip)の "Dropboxへの投稿"サービスを調整しようとしています。 私は公共のURLをたくないが、goo.glPythonと文字列連結からシェルコマンドを実行する

から短く1そのため、私はこれらのシェルコマンドを使用しています:

curl -s --data-urlencode "url=http://link.com" http://googl/action/shorten | grep "googl" | awk -F\" '{print $(NF-1)}' | awk 'BEGIN { FS = "=" } ; { print $2}' | pbcopy 

今のPythonスクリプトは、これはすべてのファイルのためのDropboxのURLをコピーしませんそれをクリップボードにパブリックフォルダ内だけコピー:

pasteURLs = [] 

for file in copied_files: # for all elements in our list 
    components = file.split(os.sep) # seperate the path 
    local_dir = os.sep.join(components[5:]) # cut off the beginning 
    local_dir = urllib.quote(local_dir) # convert it to a URL (' ' -> '%20', etc.) 
    #construct the URL 
    finalURL = 'http://dl.dropbox.com/u/%s/%s' % (dropbox_id, local_dir) 
    pasteURLs.append(finalURL) # add the current URL to the string 

copy_string = "\n".join(pasteURLs) 
os.system("echo '%s' | pbcopy" % (copy_string)) # put the string into clipboard 

私は私のpythonについて何も知らない認めざるを得ないが、それがどのようなものか、私はこれで最後の2行を変更する必要があるから:

を3210
shortURL = [] 
for thisURL in pasteURLs: 
     shortURL = os.system(curl -s --data-urlencode "url=http://link.com" http://googl/action/shorten | grep "goo.gl" | awk -F\" '{print $(NF-1)}' | awk 'BEGIN { FS = "=" } ; { print $2}' | pbcopy) 
    shortURLs.append(shortURL) 

copy_string = "\n".join(shortURLs) 
os.system("echo '%s' | pbcopy" % (copy_string)) # put the string into clipboard 

しかし、私の問題は、コマンドに正しいURLを入れる方法です。あなたはそれがhttp://link.comと言うことがわかりますが、代わりにthisURLを使用する必要があります。

アイデア?前もって感謝します!

答えて

1

私はあなたのos.systemコールはこのようなものになるはずだと思う:私はあなたのためのスクリプトを書いて、はるかに簡単なコマンドパイプラインを使用

os.system("curl -s --data-urlencode \"url=%s\" http://goo.gl/action/shorten | grep \"goo.gl\" | awk -F\\\" '{print $(NF-1)}' | awk 'BEGIN { FS = \"=\" } ; { print $2}' | pbcopy " % thisURL) 
0

はUPDATEを。 Pythonで全体がカールすることなく実行できるわけではありませんが、ここにはあります。

import subprocess 
thisURL = 'http://whatever.com' 
pipeline = [] 
pipeline.append('curl -s -i --data-urlencode "url=%s" ' % thisURL + 
    'http://goo.gl/action/shorten') 
pipeline.append('grep Location:') 
pipeline.append('cut -d = -f 2-') 
#pipeline.append('pbcopy') 
command = "|".join(pipeline) 
link, ignore = subprocess.Popen(command, stdout=subprocess.PIPE, 
     shell=True).communicate() 
print link 
+0

@ダニエルと同じですが三重引用符は非常に多くの埋め込み引用符を避けなければなりません。 –

+0

これはos.system()が出力を返さないため動作しません。 – agf

+0

ああ、サブプロセスを使用する必要があります。これを修正してみましょう。 –

0

他の答えは既にこののコアを提供している:値を挿入して、実際にコマンドからの出力を得るために、サブプロセスを使用することを検討するためにフォーマット文字列を使用して、あなたのコマンドを囲む引用符を使用します。

しかし、私のように、これがちょっと複雑すぎると思ったら、this exampleを見て、実際の短縮を行う方法をご覧ください。 Pythonを初めてお使いの方は、exception handlingを読んで理解する必要があります。 (a custom moduleが必要なように見えますが、例外が発生した場合にのみ再び使用されるように見えます)

関連する問題