【问题标题】:Using python to run bash commands and get Output使用python运行bash命令并获取输出
【发布时间】:2015-06-19 01:36:45
【问题描述】:

我想通过 Youtube-he 下载视频。所以,我写了程序,但它不工作。代码是

import os
l=["sets","relation_and_functions","Trig","Complex_Quad","Linear_inequalities","Permutation","Binomial","Sequence","Straight","conic","Three_d","Limit_Derivative","Stats","Probability","Math_reasoning"]
r=["https://www.youtube.com/playlist?list=PLD5EF274490578CC4","https://www.youtube.com/playlist?list=PL548FAD237A4B6D2E","https://www.youtube.com/playlist?list=PL42123C3873AED16F","https://www.youtube.com/playlist?list=PL880E3116D67E42FD","https://www.youtube.com/playlist?list=PLC5D1199BAE318878","https://www.youtube.com/playlist?list=PL812413BD6B55AA6E","https://www.youtube.com/playlist?list=PL78FAFAFA8496BCE1","https://www.youtube.com/playlist?list=PL6F57725E2DA8B557","https://www.youtube.com/playlist?list=PLA243228EA688A835","https://www.youtube.com/playlist?list=PL41B47FB4E23B392A","https://www.youtube.com/playlist?list=PLa2X112u1cdjdl-dsLJC1HaCeGrOarZZz","https://www.youtube.com/playlist?list=PLF6640F0A9F39F7BA","https://www.youtube.com/playlist?list=PL6FDE1AB3AE32E614","https://www.youtube.com/playlist?list=PL7FF5AD1CFF0981E5","https://www.youtube.com/playlist?list=PL13B63CD6FFAB9EA8"]
for i in range(len(l)):
    a=l[i]
    b=r[i]
    os.system("mkdir a")
    os.chdir("a")
    os.system("youtube-dl b")

【问题讨论】:

  • 这些命令中的 ab 是字符串文字,而不是您的变量。这也会创建嵌套目录(因为你永远不会 cd back up)... that is if it worked but each os.system` 是一个单独的 shell,所以 cd 实际上不会影响任何东西。
  • 抱歉错误并感谢您的纠正。我在下面发布了一个可以正常工作的新代码

标签: python linux bash youtube download


【解决方案1】:

您需要传递实际变量,而不是字符串。您还应该特别使用子进程模块check_call

l =["sets","relation_and_functions","Trig","Complex_Quad","Linear_inequalities","Permutation","Binomial","Sequence","Straight","conic","Three_d","Limit_Derivative","Stats","Probability","Math_reasoning"]
r=["https://www.youtube.com/playlist?list=PLD5EF274490578CC4","https://www.youtube.com/playlist?list=PL548FAD237A4B6D2E","https://www.youtube.com/playlist?list=PL42123C3873AED16F","https://www.youtube.com/playlist?list=PL880E3116D67E42FD","https://www.youtube.com/playlist?list=PLC5D1199BAE318878","https://www.youtube.com/playlist?list=PL812413BD6B55AA6E","https://www.youtube.com/playlist?list=PL78FAFAFA8496BCE1","https://www.youtube.com/playlist?list=PL6F57725E2DA8B557","https://www.youtube.com/playlist?list=PLA243228EA688A835","https://www.youtube.com/playlist?list=PL41B47FB4E23B392A","https://www.youtube.com/playlist?list=PLa2X112u1cdjdl-dsLJC1HaCeGrOarZZz","https://www.youtube.com/playlist?list=PLF6640F0A9F39F7BA","https://www.youtube.com/playlist?list=PL6FDE1AB3AE32E614","https://www.youtube.com/playlist?list=PL7FF5AD1CFF0981E5","https://www.youtube.com/playlist?list=PL13B63CD6FFAB9EA8"]

from subprocess import check_call

for direc, url in zip(l, r):
     check_call(["mkdir", direc])
     check_call(["youtube-dl", ele2],cwd=direc)

zip(l, r) 压缩每个列表中的相应元素,因此我们只需解压缩循环中的对。 cwd=direc 将设置下载文件的目录。

【讨论】:

  • mkdir 的调用实际上应该是对os.mkdir() 的调用。不要为您自己可以轻松完成的事情调用外部流程。
  • 效率,主要是。这将产生一个新进程,os.mkdir() 不会。
  • 我刚刚用timeit 进行了测试,得到了 10776% 的差异(20.74 秒对 0.19 秒执行 10000 次)。如果你只做一次,这不会引起注意,但这是一个真的养成的坏习惯。
  • 谢谢@Mike 我会改的
【解决方案2】:

不要使用os.system("mkdir a"),而是使用os.system("mdkir %s" % a),否则会创建一个名为a的目录。不评估字符串中的变量名。出于同样的原因,请使用os.system("youtube-dl %s" % b)。此外,使用os.system("cd a") 切换到创建的目录,之后不要忘记使用os.system("cd ..") 切换回来。

【讨论】:

    【解决方案3】:
    import os
    l=["sets","relation_and_functions","Trig","Complex_Quad","Linear_inequalities","Permutation","Binomial","Sequence","Straight","conic","Three_d","Limit_Derivative","Stats","Probability","Math_reasoning"]
    r=["https://www.youtube.com/playlist?list=PLD5EF274490578CC4","https://www.youtube.com/playlist?list=PL548FAD237A4B6D2E","https://www.youtube.com/playlist?list=PL42123C3873AED16F","https://www.youtube.com/playlist?list=PL880E3116D67E42FD","https://www.youtube.com/playlist?list=PLC5D1199BAE318878","https://www.youtube.com/playlist?list=PL812413BD6B55AA6E","https://www.youtube.com/playlist?list=PL78FAFAFA8496BCE1","https://www.youtube.com/playlist?list=PL6F57725E2DA8B557","https://www.youtube.com/playlist?list=PLA243228EA688A835","https://www.youtube.com/playlist?list=PL41B47FB4E23B392A","https://www.youtube.com/playlist?list=PLa2X112u1cdjdl-dsLJC1HaCeGrOarZZz","https://www.youtube.com/playlist?list=PLF6640F0A9F39F7BA","https://www.youtube.com/playlist?list=PL6FDE1AB3AE32E614","https://www.youtube.com/playlist?list=PL7FF5AD1CFF0981E5","https://www.youtube.com/playlist?list=PL13B63CD6FFAB9EA8"]
    c=[]
    for i in l:
        c.append(i)
    print c
    for i in range(len(l)):
        q="mkdir "+l[i]
        l[i]=q
    for j in range(len(r)):
        z="youtube-dl "+r[j]
        r[j]=z
    print c
    for i in range(len(l)):
        a=l[i]
        e=c[i]
        b=r[i]
        os.system(a)
        os.chdir(e)
        os.system(b)
        os.chdir("..")
    

    这似乎可以正常工作。 谢谢你。各位大侠帮忙

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-29
      • 2021-07-13
      • 2013-01-01
      • 2011-08-07
      • 1970-01-01
      • 2020-01-06
      • 2014-08-31
      相关资源
      最近更新 更多