从python和字符串连接运行shell命令

时间:2011-07-19 15:50:59

标签: python dropbox

我正在尝试为Snow loepard(http://dl.dropbox.com/u/1144075/Post%20to%20Dropbox.zip)调整“post to dropbox”服务。 我不想要公共网址,但需要goo.gl缩短的网址

因此我使用这些shell命令:

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一无所知,但从它的外观来看,我需要改变最后两行:

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代替。

有什么想法吗?提前谢谢!

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

UPDATE 我为您编写了脚本并使用了更简单的命令管道。并不是说整个事情都可以在没有curl的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

答案 2 :(得分:0)

其他答案已经提供了以下核心:在命令周围使用引号,使用格式字符串插入值并考虑使用子进程以实际获取命令的输出。

然而,如果你像我一样认为这有点过于复杂,那么请看看this example如何在python中进行实际的缩短。如果你是python的新手,这可能意味着你需要阅读exception handling来理解它。 (看起来你可能需要a custom module,但是如果你得到例外,它似乎只会被使用......)