当前位置: 首页 > 面试题库 >

执行子流程失败

暴阳州
2023-03-14
问题内容

我试图通过Python调用带有多个参数的进程。执行批处理文件本身对我来说很好,但是将其翻译成Python会让我大叫。这里是批处理文件的内容:

"C:\Program Files\bin\cspybat" "C:\Program Files\bin\armproc.dll" "C:\Program Files\bin\armjlink.dll" "C:\Documents and Settings\USER\Desktop\CAL\testing\Verification\FRT\Code\TC1\Output\Genericb\Debug\Exe\Gen.out" --download_only --backend -B "--endian=little" "--cpu=Cortex-M3" "--fpu=None" "-p" "C:\Program Files\CONFIG\debugger\ST\iostm32f10xxb.ddf" "--drv_verify_download" "--semihosting" "--device=STM32F10xxB" "-d" "jlink" "--drv_communication=USB0" "--jlink_speed=auto" "--jlink_initial_speed=32" "--jlink_reset_strategy=0,0"

批处理文件运行的可执行文件名为cspybat。可执行文件的输出提供以下信息:– All parameters afterbackend are passed to the back end

另请注意,某些参数是字符串,而有些则不是。

现在对我有用:

    """ MCU flashing function""" 
params = [r"C:\Program Files\bin\cspy",
          r"C:\Program Files\bin\arpro.dll",
          r"C:\Program Files\bin\arjink.dll",
          r"C:\Documents and Settings\USER\Desktop\Exe\GenerV530b.out",
          "--download_only", "--backend", "-B", "--endian=little", "--cpu=Cort3", "--fpu=None", "-p", 
          r"C:\Program Files\CONFIG\debugger\ST\iostm32f10xxb.ddf",
           "--drv_verify_download", "--semihosting", "--device=STM32F10xxB", "-d", "jlink", "--drv_communication=USB0",
            "--jlink_speed=auto", "--jlink_initial_speed=32", "--jlink_reset_strategy=0,0" ]
print(subprocess.list2cmdline(params))
p = subprocess.Popen(subprocess.list2cmdline(params))

问题答案:

在Windows中执行批处理文件:

from subprocess import Popen
p = Popen("batchfile.bat", cwd=r"c:\directory\containing\batchfile")
stdout, stderr = p.communicate()

如果您不想执行批处理文件,而是直接从Python执行问题中的命令,则需要对Popen的第一个参数进行一些试验。

首先,第一个参数可以是字符串或序列。

所以你要么写:

p = Popen(r'"C:\Program Files\Systems\Emb Work 5.4\common\bin\run" "C:\Program Files\Systems\Emb Work 5.4\arm\bin\mpr.dll" ... ...', cwd=r"...")

要么

p = Popen([r"C:\Program Files\Systems\Emb Work 5.4\common\bin\run", r"C:\Program Files\Systems\Emb Work 5.4\arm\bin\mpr.dll", ...], cwd=r"...")
# ... notice how you don't need to quote the elements containing spaces

根据文档:

在Windows上:Popen类使用CreateProcess()执行对字符串进行操作的子程序。如果args是序列,则将使用list2cmdline()方法将其转换为字符串。请注意,并非所有的MS
Windows应用程序都以相同的方式解释命令行:list2cmdline()是为使用与MS C运行时相同的规则的应用程序设计的。

因此,如果使用序列,它将被转换为字符串。我可能会先尝试一个序列,因为那样您就不必引用所有包含空格的元素了(list2cmdline()为您做到这一点)。

为了进行故障排除,我建议您将序列传递给subprocess.list2cmdline()并检查输出。

编辑:

如果我是你,这就是我要做的:

a)创建一个简单的Python脚本(testparams.py),如下所示:

import subprocess
params = [r"C:\Program Files\Systems\Emb Work 5.4\common\bin\run.exe", ...]
print subprocess.list2cmdline(params)

b)从命令行()运行脚本python testparams.py,将输出复制并粘贴到另一个命令行,按Enter键并查看会发生什么。

c)如果不起作用,请编辑python文件并重复直到它起作用。



 类似资料:
  • ipush 放到操作数栈 istore 到本地变量表 div 除 getstatic #2->常量池中的#2 找到函数 符号引用转为直接引用 接下来是invokevirtual 最后肯定有一个return 这个实例还没有涉及到堆空间,如果涉及到堆空间的话很复杂,涉及引用变量

  • 系统入口 index.php -> 载入系统常量 -> 载入系统函数 -> URL解析 -> 调度器 -> 控制器 -> Model层 -> 渲染模板 -> 结果输出

  • 无法执行目标org.apache.maven.plugins:maven-compiler-plugin:3.1:在项目gameoflife上编译(default-compile)-core:编译失败[错误]此环境中未提供编译器。也许您运行的是JRE而不是JDK? 我已经在我的机器上安装了Java,但仍然面临这个问题。 我在做EC2。

  • 我应该知道这一点,但不知为何我现在还想不出来。 是否有方法重写此代码以避免?

  • 实验执行流程概述 与实验七相比,实验八增加了文件系统,并因此实现了通过文件系统来加载可执行文件到内存中运行的功能,导致对进程管理相关的实现比较大的调整。我们来简单看看文件系统是如何初始化并能在ucore的管理下正常工作的。 首先看看kern_init函数,可以发现与lab7相比增加了对fs_init函数的调用。fs_init函数就是文件系统初始化的总控函数,它进一步调用了虚拟文件系统初始化函数vf

  • 实验执行流程概述 互斥是指某一资源同时只允许一个进程对其进行访问,具有唯一性和排它性,但互斥不用限制进程对资源的访问顺序,即访问可以是无序的。同步是指在进程间的执行必须严格按照规定的某种先后次序来运行,即访问是有序的,这种先后次序取决于要系统完成的任务需求。在进程写资源情况下,进程间要求满足互斥条件。在进程读资源情况下,可允许多个进程同时访问资源。 实验七设计实现了多种同步互斥手段,包括时钟中断管