【问题标题】:Python subprocess call with %s and * inside adb shell在 adb shell 中使用 %s 和 * 调用 Python 子进程
【发布时间】:2017-04-08 01:41:54
【问题描述】:

我正在学习 python,我很喜欢它如何帮助我自动化我的一些日常工作。我正在使用谷歌来解决我所有的问题,直到现在我都非常成功。但是这次我真的被卡住了,已经花了 2 天时间。

以下代码不起作用,因为同一行中有 %s 和 *

from Tkinter import *
import subprocess as sp
regLists = ['1b7', '1b6', '209', '197']
valLists = ['23', '80', 'ab', '73']
for regs,vals in zip(regLists,valLists):
        sp.call('adb shell "echo %s %s > /d/asoc/*-snd-card*/*_code*/code_reg"'%(regs,vals), shell=True)

错误:

Error: /system/bin/sh: can't create /d/asoc/*-snd-card*/*_code*/code_reg: 
No such file or directory
  • a) 每个设备的路径名不同
  • b) * 用于查找linux目录内的路径名

工作代码如下所示,因为没有 * 并且提到了整个路径

sp.call('adb shell "echo %s %s > /d/asoc/xyz-snd-card-device45/ffde_code-fffb/code_reg"'%(regs,vals), shell=True)

请有人帮助我如何更改上面的代码,以便我可以使用上面的代码...

【问题讨论】:

    标签: python subprocess adb wildcard


    【解决方案1】:
    for regs,vals in zip(regLists,valLists):
        echo = "echo {} {} > /d/asoc/*-snd-card*/*_code*/code_reg".format(regs,vals)
        sp.check_call(["adb", "shell" , echo])
    

    【讨论】:

    • 抱歉没用:打印 echo 显示:echo 1b7 23 > /d/asoc/*-snd-card*/*_code*/code_reg
    • 不工作不是一个很好的解释。你遇到了什么错误?
    • 对不起..第一次使用堆栈溢出并错误地点击“输入”理想的方式 echo 应该是这样的: echo 1b7 23 > /d/asoc/xyz-snd-card-device45/ffde_code-fffb /code_reg
    • 您使用通配符,因此 echo 会将值重定向到与该原始正则表达式匹配的所有文件,其中之一将是 /d/asoc/xyz-snd-card-device45/ffde_code-fffb/code_reg 我假设
    • 非常感谢您的帮助。我对此很陌生,因此需要一些时间来了解什么是 check_call,以及为什么它不起作用.. 请给我一些时间.. 谢谢
    【解决方案2】:

    感谢大家的支持。 我一定会尝试上面提到的 for 和 find 选项来更熟悉 python 编程。同时,在google上进行了更多调试,并找到了另一个可行的解决方案,如下所示。 通过使用 && 运算符,代码按预期工作。

    sp.call('adb shell "cd /d/asoc/*snd-card*/*_code* && echo %s %s > code_reg"'%(regs,vals), shell=True)
    

    PS:我还是要检查一下sp.call和sp.check_output的区别

    【讨论】:

    • 再次。如果您的文件夹名称模式扩展到多个条目,此代码也会失败。
    猜你喜欢
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    相关资源
    最近更新 更多