首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行子进程失败

执行子进程失败
EN

Stack Overflow用户
提问于 2009-11-30 09:33:00
回答 2查看 55.7K关注 0票数 19

我尝试用几个参数通过Python调用一个进程。执行批处理文件本身对我来说很好,但是把它转换成Python会让我尖叫。在这里,批处理文件的内容:

代码语言:javascript
复制
"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 after--后端are passed to the back end

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

解决方案

现在对我来说很管用:

代码语言:javascript
复制
    """ 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))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-30 10:04:17

要在Windows中执行批处理文件:

代码语言:javascript
复制
from subprocess import Popen
p = Popen("batchfile.bat", cwd=r"c:\directory\containing\batchfile")
stdout, stderr = p.communicate()

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

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

所以你要么写:

代码语言:javascript
复制
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"...")

代码语言:javascript
复制
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应用程序都以相同的方式解释命令行: list2cmdline()是为使用与MS运行时相同的规则的应用程序设计的。

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

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

编辑:

如果我是你,我会这么做:

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

代码语言:javascript
复制
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文件并重复到它工作为止。

票数 28
EN

Stack Overflow用户

发布于 2009-11-30 11:36:58

首先,你不需要所有这些引号。所以把他们移走。当文件名有空格时,您只需要引用具有文件名的参数(愚蠢地,Windows经常这样做)。

您的参数只是一个字符串列表,其中一些字符串需要引号。因为Windows使用非标准的\作为路径分隔符,所以对这些名称使用“原始”字符串。

代码语言:javascript
复制
params = [
    r'"C:\Program Files\Systems\Emb Work 5.4\arm\bin\mpr.dll"',
    r'"C:\Program Files\Systems\Emb Work 5.4\arm\bin\ajl.dll"',
    r'"C:\Documents and Settings\USER\Desktop\abc.out"',
    "--backend",
    "-B", 
    "--endian=little",
    "--cpu=Cortex",
    "--fpu=None",
    "-p",
    r'"C:\Program Files\unknown\abc.ddf"',
    "--drv_verify_download",
    "--semihosting",
    "--device=STM32F10xxB",
    "-d",
    "jjftk",
    "--drv_communication=USB0",
    "--speed=auto",
    "--initial_speed=32",
    "--reset_strategy=0,0"]

使用类似的东西

代码语言:javascript
复制
program = r'"C:\Program Files\Systems\Emb Work 5.4\common\bin\run"'
subprocess.Popen( [program]+params )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1818774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档