Getting decode error. - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: General Coding Help (https://python-forum.io/forum-8.html) +--- Thread: Getting decode error. (/thread-12795.html) |
Getting decode error. - shankar - Sep-13-2018 import sys import os import subprocess import inspect def run_process(cmd_args): with subprocess.Popen(cmd_args) as p: p.communicate() if __name__ == "__main__": f = open(os.environ['OUTPUT_PATH'], 'w') cmd_args_cnt = 0 cmd_args_cnt = int(input()) cmd_args_i = 0 cmd_args = [] while cmd_args_i < cmd_args_cnt: try: cmd_args_item = str(input()) except: cmd_args_item = None cmd_args.append(cmd_args_item) cmd_args_i += 1 res = run_process(cmd_args); #f.write(res.decode("utf-8") + "\n") if 'with' in inspect.getsource(run_process): f.write("'with' used in 'run_process' function definition.\n") if 'Popen' in inspect.getsource(run_process): f.write("'Popen' used in 'run_process' function definition.\n") f.write('Process Output : %s\n' % (res.decode("utf-8"))) f.close()# this is the input 3 python -c print("Hello") Your Output 'with' used in 'run_process' function definition. 'Popen' used in 'run_process' function definition. Expected Output 'with' used in 'run_process' function definition. 'Popen' used in 'run_process' function definition. Process Output : Hello ERROR(stderr):
RE: Getting decode error. - buran - Sep-13-2018 your run_process function does not have explicit return, thus it returns None. It look like tou want to return something and it has to have decode method RE: Getting decode error. - shankar - Sep-13-2018 I am new to forum.Thanks for adding tags. I tried this code def run_process(cmd_args): with subprocess.Popen(cmd_args) as p: p.communicate() return pgetting this error
RE: Getting decode error. - snippsat - Sep-13-2018 Like this and you most also activate stdout,stderr pipes. Now you decode out.decode() is the same as out.decode('utf-8') def run_process(cmd_args): with subprocess.Popen(cmd_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) as p: out, err = p.communicate() return outIf also want to return err return out,err ,then it become a Tuple and you use res[0].decode() . This is a very old way of doing string formatting. From 3.6 use f-string . f.write('Process Output : %s\n' % (res.decode("utf-8"))). # To f.write(f'Process Output: {res.decode()}\n') RE: Getting decode error. - shankar - Sep-13-2018 This line is computer generated.I cant modify it f.write('Process Output : %s\n' % (res.decode("utf-8")))I tried your function but I got this error
RE: Getting decode error. - volcano63 - Sep-13-2018 (Sep-13-2018, 09:48 AM)shankar Wrote: This line is computer generated.I cant modify it process.communicate returns a tuple - regular stdout and stderr . Use its result as @snippsat has shown. You are trying to use both elements of the method output.
RE: Getting decode error. - snippsat - Sep-13-2018 Can test function. # cm.py import subprocess def run_process(cmd_args): with subprocess.Popen(cmd_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) as p: out, err = p.communicate() return out E:\div_code\new λ ptpython -i cm.py >>> res = run_process('ls') # Return bytes >>> res b'001.png\n002.png\n003.png\n004.png\ncm.py\n' # To string >>> res.decode() '001.png\n002.png\n003.png\n004.png\ncm.py\n' # Write to file >>> with open('output.txt', 'w') as f: ... f.write(f'Process Output: \n{res.decode()}\n')output.txt: If return out, err then it will be a tuple.>>> res (b'001.png\n002.png\n003.png\n004.png\ncm.py\noutput.txt\n', b'') >>> res[0] b'001.png\n002.png\n003.png\n004.png\ncm.py\noutput.txt\n' >>> res[0].decode() '001.png\n002.png\n003.png\n004.png\ncm.py\noutput.txt\n' # Or unpack back >>> out, err = res >>> out b'001.png\n002.png\n003.png\n004.png\ncm.py\noutput.txt\n' RE: Getting decode error. - shankar - Sep-14-2018 Thanks a lot @snippsat RE: Getting decode error. - tinman - Sep-20-2019 Shankar, the question you posted is for an exercise from Hackerrank and should not be shared publicly. I hope you passed the course. tinman |