baldurmen
baldurmen

Reputation: 699

Python - How to use py.path.LocalPath.sysexec()

I'm trying to use LocalPath.sysexec() from the py library, but the documentation is not clear enough for me to understand how to invoke it with the right syntax.

Here is some fake code that mimics my syntax:

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Testing pylib implementation of subprocess.Popen

from py.path import local
import sys

path = local(sys.argv[1])

path.sysexec("/usr/bin/foo", ["arg1", "arg2"])

Upvotes: 0

Views: 880

Answers (1)

atupal
atupal

Reputation: 17240

You can look the source code:

def sysexec(self, *argv, **popen_opts):
    """ return stdout text from executing a system child process,
        where the 'self' path points to executable.
        The process is directly invoked and not through a system shell.
    """
    from subprocess import Popen, PIPE
    argv = map_as_list(str, argv)
    popen_opts['stdout'] = popen_opts['stderr'] = PIPE
    proc = Popen([str(self)] + argv, **popen_opts)
    stdout, stderr = proc.communicate()
    ret = proc.wait()
    if py.builtin._isbytes(stdout):
        stdout = py.builtin._totext(stdout, sys.getdefaultencoding())
    if ret != 0:
        if py.builtin._isbytes(stderr):
            stderr = py.builtin._totext(stderr, sys.getdefaultencoding())
        raise py.process.cmdexec.Error(ret, ret, str(self),
                                       stdout, stderr,)
    return stdout

clearly, It use the python subprocess module. If you have not been used subprocess, you can click the above link to raed the docs. In this function, It use subprocess construct a Popen object, and use the argv you pass. Then call the Popen.wait(), block until the command execute finish. And return the stdout of the command.

Example:

local_path = py._path.local.LocalPath('/usr/bin/ls')
print(local_path.sysexec())
# out: file1\nfile2\nfile3...
print(local_path.sysexec('-l'))
# out likes "ls -l" out

Upvotes: 2

Related Questions