subprocess problem

Cameron Simpson cs at zip.com.au
Wed Feb 8 23:54:52 EST 2017


On 08Feb2017 18:56, Andreas Paeffgen <oegeeks at gmail.com> wrote:
>The Problem with the subprocess code is: Using the sourcecode 
>functioning as normal.
>The frozen app with cx_freeze on every platform just returns an empty result

I don't know what the sentence above above cx_freeze means.

>Here is the code in short:
>def get_path_pandoc():
>   settings = QSettings('Pandoc', 'PanConvert')
>   path_pandoc = settings.value('path_pandoc','')
>   if not os.path.isfile(path_pandoc):
>       if platform.system() == 'Darwin' or os.name == 'posix':
>           args = ['which', 'pandoc']
>           p = subprocess.Popen(
>               args,
>               stdin=subprocess.PIPE,

"which" doesn't read any input. You probably want "subprocess.DEVNULL" instead 
of "subprocess.PIPE" for stdin.

>               stdout=subprocess.PIPE)
>           path_pandoc = 
>           str.rstrip(p.communicate(path_pandoc.encode('utf-8'))[0].decode('utf-8'))
>
>The whole problematic code can be checked on 
>http://github.com/apaeffgen/panconvert
>in source/converters/interface_pandoc.py
>
>I debugged it with some QMessage-Boxes. I just know, that the returnd 
>result is empty.
>I tried some stderr on this code also. But also the error message is empty.

What does "which pandoc" say to you at a terminal prompt? The code above relies 
on that returning you the path to the pandoc executable. If it is not in your 
path then you will get an empty result.

Also, the "which" programme should have a zero exit status if it finds and 
prints the path to pandoc, and a nonzero exit status otherwise?  Find out what 
exit status it returns. This is available from the "p" object after 
communicate() returns. See the subprocess doco for details. The easy thing to 
do is probably to call "p.check_returncode()" after communicate() returns.

>Any hints what could be changed in the code, so it also works in the 
>frozen app?

What's a frozen app?

Maybe that is your problem: when you run the programme by hand it works, but in 
this "forzen" state it doesn't.

The "which" command isn't magic. It searchs for commands by looking for 
executables in the directories listed in the $PATH environment variable. Get 
your program to print or display the value of "os.environ['PATH']" before 
invoking "which". The difference may tell you something useful.

>At the moment i use python3.4 to 3.5 depending on the platform (Mac, 
>Win, Linux)

Thank you for this information; many people forget to supply it.

>P.S. Tried also some code with invoking the bash and afterwords the which 
>pandoc code. To know avail also

From a shell prompt (such as bash's prompt) issuing the command:

  which pandoc

should print the executable path, _if_ your $PATH includes the right directory.  
You can look at $PATH from the shell with the command:

  echo $PATH

Do you know where pandoc normally resides on your system?

Cheers,
Cameron Simpson <cs at zip.com.au>



More information about the Python-list mailing list