BFlint
BFlint

Reputation: 2827

Python subprocess communication

I'm trying to run a python script that will open a command prompt(OSGeo4W.bat is a command prompt line). I can get it to open but now I would like to send the command prompt commands.

import subprocess

myProcess = subprocess.Popen(['C:\OSGeo4W64\OSGeo4W.bat'],shell = False)  #opens command prompt
myProcess.communicate('gdal2tiles -p raster -z 0-1 new.jpg abc') 
myProcess.wait()
print("my process has terminated")

I've also tried

subprocess.check_call('gdal2tiles -p raster -z 0-1 new.jpg abc', shell=False)

I keep getting errors that say "WindowsError: [Error 2] The system cannot find the file specified"

although, if I were to keep the command prompt that it opens and type in " 'gdal2tiles -p raster -z 0-1 new.jpg abc' " then it will work just as I wanted. Help would be great, thanks!

Upvotes: 0

Views: 1758

Answers (2)

Nicolas Cadieux
Nicolas Cadieux

Reputation: 1

For those of you that are still trying to figure this one out, this is what I found. The "stdin=subprocess.PIPE" method above works with some command line tool in OSGeo4W64 but not all. It works with gdal_translate but not pdal translate for example. Not sure why;(

My Solution:

OSGeo4Wenv = r'CALL "C:/OSGeo4W64/bin/o4w_env.bat" '

pdal_translate_String = r'c:/OSGeo4W64/bin/pdal translate c:\inputFile c:\outputFile radiusoutlier --filters.radiusoutlier.min_neighbors=2 --filters.radiusoutlier.radius=8.0 --filters.radiusoutlier.extract=true'

Cmd = str(OSGeo4Wenv)+' & '+str(pdal_translateCmd)

shell = subprocess.call(Cmd, stdout=None, shell=True)

What is going on? 1) Open shell and set up the OSGeo4W environment by calling "OSGeo4Wenv". This is normally called by the OSGeo4W.bat file. Without this, the command line programs don't know where to look for the libraries.

2) The pdal_translate command is then sent to the dos shell because in Windows, multiple commands can be separated by the "&" symbol. I use the .call method of python 2.7. It has the advantage that it waits for the end of the process. That is nice if you use the multiprocessing map.pool method to launch multiple processes at the same time.

Hope this help others! Nicolas

Upvotes: -1

jfs
jfs

Reputation: 414915

Try:

check_call('gdal2tiles -p raster -z 0-1 new.jpg abc', shell=True)

shell=True changes how the executable is searched on Windows.

Or if gdal2tiles works only in the environment created by OSGeo4W.bat:

shell = Popen(r'C:\OSGeo4W64\OSGeo4W.bat', stdin=subprocess.PIPE)
shell.communicate('gdal2tiles -p raster -z 0-1 new.jpg abc')
# you don't need shell.wait() here

Notice: r"" literal. It is necessary to avoid escaping the backslashes in the path.

Upvotes: 2

Related Questions