I have a Python script that I run in ArcGIS Desktop 10.2. I also have an FME workbench I use in part of the same process. I currently have to run half of the script, switch to FME then run the other half. I would like my script to call the FMW.
At present I'm trying:
cmd = '"C:\\Program Files\\FME201864bit\\fme.exe" "W:\\Entity\\ABZ\\Operations & Geosciences\\GSR\\GIS Data\\_Common-Data\\_Resources\\Tools\\MigMapCountourFiller.fmw" --SourceDataset_ESRISHAPE "\\\\main.glb.corp.local\\Data\\EP\\EMEA\\GB\\Group\\Data\\GIS\\Explo\\NewVentures\\Opportunities\\Winterton2018\\Migration\2018円-02-14_CarbMigFiles\\contours_l_1m.shp" --DestDataset_ESRISHAPE "\\\\main.glb.corp.local\\Data\\EP\\EMEA\\GB\\Group\\Data\\GIS\\Explo\\NewVentures\\Opportunities\\Winterton2018\\Migration\2018円-02-14_CarbMigFiles"'
os.system(cmd)
this is returning:
'C:\Program' is not recognised as an internal or external command, operable grogram or batch file. The system cannot find the path specialised.
I can see that the problem is the space between program and files but I dont understand why its ignoring my quotes.
I see there are multiple ways of accessing command line from python and that there is also FMEobjects but I haven't managed to get them to work. Am I trying the right thing but getting it wrong or should I be using a completely different method.
-
By "a python script that I run in ArcGIS Desktop", do you mean a Python Script tool in a standard TBX toolbox, or a Python Toolbox PYT tool, or something else? In any event what code snippet are you using to try and run the two lines that you appear to have copy/pasted from your actual code?PolyGeo– PolyGeo ♦2018年06月20日 18:43:58 +00:00Commented Jun 20, 2018 at 18:43
-
Ultimately it will end up in a python Toolbox but at the moment I'm just trying to run these two lines by themself from python console in ArcMapwhatahitson– whatahitson2018年06月21日 09:54:26 +00:00Commented Jun 21, 2018 at 9:54
3 Answers 3
Managing all arguments in a single string is a debugging hell.
You would be better off using subprocess
and having your arguments in a tidy list structure.
import os
import subprocess
args = [r"C:\FME\fme.exe", "version"]
subprocess.Popen(args)
Output:
FME 201800.0 (20180308 - Build 18284 - WIN64)
Your arguments would obviously be different. In my case, I just want to make sure the fme.exe
is called with a single argument.
As Mark pointed out, your other option is to use fmeobjects
which would give you ability to call your workbenches. The minimal working code:
import sys
sys.path.append(r'C:\FME\fmeobjects\python27')
#----------------------------------------------------------------------
def buffer_single_shapefile_diff_param_values():
try:
wkspc_path = r"C:\FMEWorkbenches\BufferForSameShapefile.fmw"
wkspc = fmeobjects.FMEWorkspaceRunner()
for dist in xrange(100,200,25):
wkspc.runWithParameters(wkspc_path,
{"Output_buffered_name":"Buffered_{0}m".format(dist),
"OFFSET":"{0}".format(dist)})
except fmeobjects.FMEException, err:
print "FMEException: %s" % err
sys.exit(1)
buffer_single_shapefile_diff_param_values()
Although what you are trying should work (I don't have enough Python knowledge to debug quotes) I think the better solution is to use FME Objects.
Check out the documentation for the FMEObjects API. In particular you're looking for a method called fmeobjects.FMEWorkspaceRunner and FMEWorkspaceRunner.run(workspace)
You say you couldn't get FME Objects to work. Was there a particular issue or error? Were you using this method or something else?
-
I add the fmeobjects module by entering import sys ... sys.path.append(r'C:\Program Files\FME201864bit\fmepython27') but then whenever I type FME objects I get NameError: name 'fmeobjects' is not definedwhatahitson– whatahitson2018年06月21日 07:28:25 +00:00Commented Jun 21, 2018 at 7:28
-
1I think I've got it working nowwhatahitson– whatahitson2018年06月21日 14:03:22 +00:00Commented Jun 21, 2018 at 14:03
If you scroll up to the top of the log there is an example batch command for the script:
cmd = [r"C:\Program Files\FME\fme.exe", r"D:\teararoa\nz\script\ET_Node.fmw", r"--SourceDataset_GEODATABASE_FILE d:\teararoa\nz\current.gdb", r"--DestDataset_GEODATABASE_FILE d:\teararoa\nz\current.gdb", r"--DestDataset_GEODATABASE_FILE_4 d:\teararoa\nz\current.gdb"]
Which I have converted to a python list and escaped the backslashes. Then use the python module subprocess as above - easy
import subprocess, os
result = subprocess.Popen(cmd)
if not result.returncode:
print("Failed!", result)
os.startfile(r"D:\teararoa\nz\script\ET_Node.log")
else:
print"hooray!")
The trouble is fme.exe always returns a non-zero result when you use subprocess.call() Even if the log says it was successful with no warnings. How can I get a proper success/fail flag? Answering my own question: use result = subprocess.Popen(cmd) and then test NOT result.returncode for success The reason I do this at all is because I am mixing ArcMap (32 bit) and FME 64 bit in one workflow. I don't even install fme32 now.
Explore related questions
See similar questions with these tags.