Python: subprocess.call and variants fail for a particular application from executed .py but not from python in CLI

Viewed 39

I have a strange issue here - I have an application that I'm attempting to launch from python, but all attempts to launch it from within a .py script fail without any discernable output. Testing from within VSCode debugger. Here's some additional oddities:

  1. When I swap in notepad.exe into the .py instead of my target applications path, notepad launches ok.
  2. When I run the script line by line from the CLI (start by launching python, then type out the next 4-5 lines of Python), the script works as expected.

Examples:

#This works in the .py, and from the CLI

import subprocess

cmd = ['C:\\Windows\\system32\\notepad.exe', 'C:\\temp\\myfiles\\test_24.xml']
pipe = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
pipe.wait()
print(pipe)
#This fails in the .py, but works ok when pasted in line by line from the CLI

import subprocess

cmd = ['C:\\temp\\temp_app\\target_application.exe', 'C:\\temp\\myfiles\\test_24.xml']
pipe = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
pipe.wait()
print(pipe)

The result is no output when running the .py

I've tried several other variants, including the following:

import subprocess

tup = 'C:\\temp\\temp_app\\target_application.exe C:\temp\test\test_24.xml'

proc = subprocess.Popen(tup)
proc.wait()
(stdout, stderr) = proc.communicate()

print(stdout)
if proc.returncode != 0:
    print("The error is: " + str(stderr))
else:
    print("Executed: " + str(tup))

Result:

None
The error is: None
1.082381010055542

Now this method indicates there is an error because we are returning something other than 0 and printing "The error is: None", and this is because stderror is "None". So - is it throwing an error without giving an error? stdout is also reporting "None".

So, lets try check_call and see what happens:

print("Trying check_call")
    try:
        subprocess.check_call('C:\\temp\\temp_app\\target_application.exe C:\\temp\\test\\test_24.xml', shell=True)
    except subprocess.CalledProcessError as error:
        print(error)

Results:

Trying check_call
Command 'C:\temp\temp_app\target_application.exe C:\temp\test\test_24.xml' returned non-zero exit status 1.

I've additionally tried subprocess.run, although it is missing the wait procedure I was hoping to use.

import subprocess

tup = 'C:\\temp\\temp_app\\target_application.exe C:\temp\test\test_24.xml'

proc = subprocess.run(tup, check=True)
proc.wait()
(stdout, stderr) = proc.communicate()

print(stdout)
if proc.returncode != 0:
    print("The error is: " + str(stderr))
else:
    print("Executed: " + str(tup))

What reasons might be worth chasing, or what other ways of trying to catch an error might work here? I don't know how to interpret "`" as an error result.

0 Answers
Related