Python Forum

Full Version: Python cmd function call from script
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2
Dear all,

I found a function which is callable from command line. Now I need to add this function to my script. How can I do this?
So if I use CMD, call looks like this - 


sudo python fun_name1.py -t 'a' -r 2


How can I add the same call in another python script?

Thank you for your answer.
You can use subprocessing library to do that. 

subprocess.Popen(you command)
Hard to answer without looking at the code in fun_name1.py. If it is written adequately, you can import it as a Python module and call the functions it contains directly.
(Feb-14-2017, 01:46 AM)Ofnuts Wrote: [ -> ]Hard to answer without looking at the code in fun_name1.py. If it is written adequately, you can import it as a Python module and call the functions it contains directly.

Function is stm32loader.py -> stm32
(Feb-14-2017, 05:23 AM)John_O Wrote: [ -> ]
(Feb-14-2017, 01:46 AM)Ofnuts Wrote: [ -> ]Hard to answer without looking at the code in fun_name1.py. If it is written adequately, you can import it as a Python module and call the functions it contains directly.

Function is stm32loader.py -> stm32

Well it seems it is. You can try to import it and use the CommandInterface class directly.
As peterkl suggested - use the subprocess method

Here's a link on how to run Linux commands from python.
Of the methods shown, the subprocess method is safer than the os.system
method.
see https://www.cyberciti.biz/faq/python-exe...-examples/
[url=https://www.cyberciti.biz/faq/python-execute-unix-linux-command-examples/][/url]
Thank you for all your answer. I found one issue if I use subprocess function in combination with stm32loader. So, I have stm32loader.py script and additional file (sthdbg.bin) in mwork directory ->  path (/home/projects/mwork) on my RPi. 
If I use cmd and if I go in mwork directory I can use this command:
sudo python stm32loader.py -p '/dev/ttyAMA0' -e -w -v sthdbg.bin

If I use this command from another script which is also in mwork directory in combination with subprocess function then command looks like this:
subprocess.Popen(['sudo', 'python', 'stm32loader.py', '-p', "/dev/ttyAMA0", '-e', '-w', '-v', sthdbg.bin])
But I get error "NameError: name 'sthdbg' is not defined".
Do I need to use path?
It looks like sthdbg.bin should be quoted like the rest of elements in the list supplied to Popen
I missed that. Thanks. But in case if sthdbg.bin is on other location than script, how can I add the path? 
Do I need to add absolute path - in my case '/home/projects/mywork/sthdbg.bin'?
yes, I think you need to specify the full path in this case

Also, looking at the script,  here is some code that should allow to use it to erase, write and verify (based on your cmd line)

NOTE THAT IT IS NOT TESTED SO USE IT ON YOUR OWN RISK, but should help you start and experiment

import smt32loader as smtl


# default address and baudrate, but in the script the defaults are set in if name == '_-main__'
# so we need to set up it here
address = 0x08000000
#baudrate = 115200


# default QUITE is 20, but if run the script from cmd and don't supply -V or -q, QUITE=5
# mdebug is commented right now
smtl.QUITE = 5 

port = '/dev/ttyAMA0'
bin_file = 'sthdbg.bin' # full path should be here

cmd = smtl.CommandInterface()
cmd.open(port)
# smtl.mdebug(10, "Open port %(port)s, baud %(baud)d" % {'port':port, 'baud':baud})
try:
   try:
       cmd.initChip()
   except:
       print "Can't init. Ensure that BOOT0 is enabled and reset device"
   bootversion = cmd.cmdGet()
   # smtl.mdebug(0, "Bootloader version %X" % bootversion)
   id = cmd.cmdGetID()
   # smtl.mdebug(0, "Chip id: 0x%x (%s)" % (id, smtl.chip_ids.get(id, "Unknown")))

# data
   data = map(lambda c: ord(c), file(bin_file, 'rb').read())

# erase
   cmd.cmdEraseMemory()

# write
   cmd.writeMemory(address, data)

# verify
   verify = cmd.readMemory(address, len(data))
   if(data == verify):
       print "Verification OK"
   else:
       print "Verification FAILED"
       print str(len(data)) + ' vs ' + str(len(verify))
       for i in xrange(0, len(data)):
           if data[i] != verify[i]:
               print hex(i) + ': ' + hex(data[i]) + ' vs ' + hex(verify[i])

finally:
   cmd.releaseChip()
there are at least two parts of the code, that I would write differently - line 31 and the loop in lines 42-44, but that's how it is in the original code
Pages: 1 2