Skip to content Skip to sidebar Skip to footer

Porting 'sh 1.11'-based Code To Windows

All signs seem to indicate that my script is fully operational within a Linux environment and as far as I can tell, the only thing keeping it from working in Windows is my usage of

Solution 1:

Following Kevin Brotcke's answer, this is the hack we went with:

try:
    import sh
except ImportError:
    # fallback: emulate the sh API with pbsimport pbs
    classSh(object):
        def__getattr__(self, attr):
            return pbs.Command(attr)
    sh = Sh()

Solution 2:

pbs.CommandNotFound error message is because pbs does not have a convert method. Instead you need to use the Command method:

importpbsconvert= pbs.Command('convert')

Now you can use it similar to sh:

convert(inputfile, '-resize', r, '-quality', q, '-strip', outputfile)

Solution 3:

Sub process is your best bet. While, as you said it isn't the easiest to learn, it is really useful. I would look at this indepth tutorial. Of course, read the docs too.

As to your specific problem, sh has been around longer than pbs, so it almost certainly has more functions. Looking through the source (pbs.py), I found no function named convert(). Also, you changed the arguments you called from sh to pbs (you didn't put an inputfile). Finally, there is no function named convert() in sh.py from the git repo, so I suspect you are confusing it with convert from something else.

Beyond that, you should be able to use pbs and subprocess in conjunction.

Solution 4:

You could use stdlib's subprocess module, to run the command on Windows:

#!/usr/bin/env pythonfrom subprocess import check_call

check_call(r'c:\path\to\ImageMagick\convert.exe image.jpg -resize 350x350 -quality 80 -strip small\export.jpg')

It is important to provide the full path with the file extension otherwise a different convert command may be chosen.

check_call() raises an exception if convert exits with non-zero status. You could use subprocess.call() and check the status manually instead.

Post a Comment for "Porting 'sh 1.11'-based Code To Windows"