0

I am new to python so my apologies in advance if the question is somewhat dumb or unrealistic.

I have an internally developed tool that converts traces of an ECU to a human readable data with the help of some self-developed python packages that I don’t have access to.

I want to “export” some signal values obtained in this tool (that I can store in a python list in the tool) to an external python script where I can do some additional processing. Something like this: inTool.py

#do some trace processing, get signal_values as a result 
def when_done():
   start external python script and give it signal_values as input 

external_Script.py

#import signal_values from inTool.py and do some additional processing.

Is this doable?

Reason: the tool cannot handle third-party packages well and often crashes. That is why solutions similar to this don’t work for me .

My last resort would probably be to write the values to a text file in the tool and read them out again in my script but I was wondering if there is a nicer way to do it. Thanks!

3 Answers 3

3

Writing to an intermediate file is fine, lots of tools do it. You could write your script to use a file or read from its sys.stdin. Then you have more options on how to use it.

external_script.py

import sys

def process_this(fileobj):
    for line in fileobj:
        print('process', line.strip())

if __name__ == "__main__":
    # you could use `optparse` to make source configurable but
    # doing a canned implementation here
    if len(sys.argv) == 2:
        fp = open(sys.argv[1])
    else:
        fp = sys.stdin
    process_this(fp)

The program could write a file or pipe the data to the script.

import subprocess as subp
import sys

signal_values = ["a", "b", "c"]
proc = subp.Popen([sys.executable, "input.py"], stdin=subp.PIPE)
proc.stdin.write("\n".join(signal_values).encode("utf-8"))
proc.stdin.close()
proc.wait()

You could pipeline through the shell

myscript.py | external_script.py
Sign up to request clarification or add additional context in comments.

2 Comments

Thanks for showing the way! My signal_values is a dictionary {signal_name : values} and I only get the keys when I try your method. Am I missing something or how do I also get the values?
Data needs to be serialized to move between processes and there are lots of options. You could use JSON, convert to a CSV, use a python pickle or a hundred other options.
3

The usual way of passing data from one script to another is to just import the destination function and call it:

# inTool.py
from external_script import additional

def when_done():
    signal_values = ...        # list referenced by signal_values
    additional(signal_values)  # directly call function in external_script.py

Comments

0

I know this is an older post. I searched for a while for a solid answer and quamrana's response was the best. I'm going to just add to it a little to show a working example.

main.py from other_script import run_this_test

def do_something():
    var = "Hello World!"
    run_this_test(var)

do_something()

other_script.py

def run_this_test(x):
print(x)

This is my first time posting something like this on here, I know it's basic, but this worked for me!

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.