【问题标题】:Command works fine from terminal or inside bash script but not from python script using subprocess module命令可以从终端或 bash 脚本中正常工作,但不能从使用子进程模块的 python 脚本中正常工作
【发布时间】:2019-11-23 00:34:03
【问题描述】:

我正在尝试用 python 编写代码来自动化我通常手动完成的工作。工作只是修改 C 代码的某些部分,然后将以下命令插入终端,为每个 Z1 Zolertia motes 构建、编译和引导加载 C 代码。

sudo scons board=z1 toolchain=mspgcc bootload=/dev/ttyUSB0 oos_openwsn    

该命令在终端或 bash 脚本中运行良好,但是当我从 python 脚本运行它时,它无法正常运行。

我认为问题是:构建和编译阶段成功完成,但引导加载阶段(Mass Erase)运行了两次,因此端口关闭,再也看不到了。

这部分代码麻烦:

subprocess.call('(cd /home/ilkin/git/Yadhunandana-testbed/openwsn-fw ; sudo scons board=z1 toolchain=mspgcc bootload=/dev/ttyUSB0 oos_openwsn)', shell=True)

这是构建、编译和引导加载阶段的输出。如您所见,“批量擦除”同时运行,因此它失败了。

sudo python automate.py 

scons: Reading SConscript files ...

___                 _ _ _  ___  _ _ 
| . | ___  ___ ._ _ | | | |/ __>| \ |
| | || . \/ ._>| ' || | | |\__ \|   |
`___'|  _/\___.|_|_||__/_/ <___/|_\_|
    |_|                  openwsn.org

none
scons: done reading SConscript files.
scons: Building targets ...
Dynifying build/z1_mspgcc/openapps/openapps_dyn.c
msp430-size build/z1_mspgcc/projects/common/03oos_openwsn_prog
  text    data     bss     dec     hex filename
 51442     532    6598   58572    e4cc build/z1_mspgcc/projects/common/03oos_openwsn_prog
z1_bootload(["build/z1_mspgcc/projects/common/03oos_openwsn_prog.phonyupload"], ["build/z1_mspgcc/projects/common/03oos_openwsn_prog.ihex"])
starting bootloading on /dev/ttyUSB0
MSP430 Bootstrap Loader Version: 1.39-goodfet-8
Mass Erase...
MSP430 Bootstrap Loader Version: 1.39-goodfet-8
Mass Erase...
Traceback (most recent call last):
 File "bootloader/z1/z1-bsl-nopic", line 1925, in <module>
   main(0);
 File "bootloader/z1/z1-bsl-nopic", line 1840, in main
   for f in toinit: f()
 File "bootloader/z1/z1-bsl-nopic", line 1102, in actionMassErase
   0xa506)             #Required setting for mass erase!
 File "bootloader/z1/z1-bsl-nopic", line 761, in bslTxRx
   self.bslSync(wait)                          #synchronize BSL
 File "bootloader/z1/z1-bsl-nopic", line 720, in bslSync
   raise BSLException(self.ERR_BSL_SYNC)       #Sync. failed
__main__.BSLException: Bootstrap loader synchronization error
done bootloading on /dev/ttyUSB0
scons: done building targets.

当我从终端手动运行命令时,情况并非如此,“批量擦除”部分只运行一次并且引导加载成功完成。我期望这样的输出:

(cd /home/ilkin/git/Yadhunandana-testbed/openwsn-fw ; sudo scons board=z1 toolchain=mspgcc bootload=/dev/ttyUSB0 oos_openwsn)

scons: Reading SConscript files ...

___                 _ _ _  ___  _ _ 
| . | ___  ___ ._ _ | | | |/ __>| \ |
| | || . \/ ._>| ' || | | |\__ \|   |
`___'|  _/\___.|_|_||__/_/ <___/|_\_|
    |_|                  openwsn.org

none
scons: done reading SConscript files.
scons: Building targets ...
Dynifying build/z1_mspgcc/openapps/openapps_dyn.c
msp430-size build/z1_mspgcc/projects/common/03oos_openwsn_prog
  text    data     bss     dec     hex filename
 51442     532    6598   58572    e4cc build/z1_mspgcc/projects/common/03oos_openwsn_prog
z1_bootload(["build/z1_mspgcc/projects/common/03oos_openwsn_prog.phonyupload"], ["build/z1_mspgcc/projects/common/03oos_openwsn_prog.ihex"])
starting bootloading on /dev/ttyUSB0
MSP430 Bootstrap Loader Version: 1.39-goodfet-8
Mass Erase...
Transmit default password ...
Invoking BSL...
Transmit default password ...
Current bootstrap loader version: 2.13 (Device ID: f26f)
Changing baudrate to 38400 ...
Program ...
51974 bytes programmed.
Reset device ...
done bootloading on /dev/ttyUSB0
scons: done building targets.

提前谢谢你!

【问题讨论】:

  • 你在cd /home....之前有一个多余的左大括号(
  • 这是一个小的语法错误,我在 stackoverflow 中输入时忘记用 ) 关闭。我在这里更正了代码。
  • 为什么要在子进程中运行?我的意思是为什么(cd here; do this) 而不是cd here; do this
  • 抱歉回复晚了 :) 实际上,它是双向的。不需要括号。
  • 有空的时候看看 PEP 324,它很好地描述了启动和与进程的通信:python.org/dev/peps/pep-0324

标签: python linux scons toolchain mspgcc


【解决方案1】:

幸运的是,我已经解决了这个问题。问题的发生是因为在我的代码中使用了一个函数来列出连接的串行设备。主要原因是这个功能在列出串行设备后关闭了它们。因此,在这段时间内看不到串行端口,因为当串行关闭时(以微秒为单位),引导加载阶段在某些行之后开始。

def serial_ports():

ports = glob.glob("/dev/ttyUSB*")

result = []
for elements in reversed(ports):
    try:
        s = serial.Serial(elements)
        s.close()
        result.append(elements)
    except (IOError, serial.SerialException):
        pass

【讨论】:

    猜你喜欢
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 2016-05-22
    相关资源
    最近更新 更多