3

I have written a python script to export my mxd into a pdf (not using data driven pages). I am getting the error that my mxd path is incorrect! I have included my script below. Any help would be appreciated.

# Necessary modules
import arcpy, os, string, sys

# For less complicated scripts -
# these 2 imports are necessary to utilize a simpler method of debugging outher than traceback 
import win32ui, win32con

# example debug message to screen ......
# arcpy.AddMessage("mxd_file = " + str(mxd_file))
# val = win32ui.MessageBox("mxd_file = " + str(mxd_file), "title",
                          #win32con.MB_OKCANCEL)

#Paramaters...

mxdList = string.split(arcpy.GetParameterAsText(0), ";")
dir = arcpy.GetParameterAsText(1)

#Loop thru & take the base name of each MXD selected and append all map pages to a single pdf 
# and save to chosen directory......

for mxdPath in mxdList:
    mxd = arcpy.mapping.MapDocument(mxdPath)
    name = mxdPath[:-4] + ".pdf"
    file = dir + os.sep + os.path.basename(name)
    ddp = mxd
    ddp.exportToPDF(file, "ALL")

del mxd, file   
2
  • 4
    Have you tried including a message to check 'mxdPath' to ensure it's a valid path?
    – bluefoot
    Commented Feb 22, 2013 at 21:39
  • 1
    Also, can you give an example of how you are calling the script? Are you using fully qualified paths?
    – nicksan
    Commented Feb 22, 2013 at 22:49

1 Answer 1

6

I think the comments have addressed your immediate issue, but here are just a few suggestions for writing cleaner, more "Pythonic" code:

  1. When choosing names for variables (or, more correctly termed in Python, "identifiers"), avoid using names of built-in types and functions. file and dir are examples of these. name is not, but it's pretty generic. Try to use descriptive identifiers, not only to avoid naming conflicts, but to help yourself and others better understand your code.
  2. Take advantage of the standard library (and check out Doug Hellman's PyMOTW site for a whirlwind tour). For example, you could use the functions in the os.path module (see also the PyMOTW article on it) to make your path manipulations more robust and clear to other Python programmers.

    • Instead of:

      name = mxdPath[:-4] + ".pdf"
      

      Use os.path.splitext, os.extsep and the built-in join method for string objects (might as well do os.path.basename here as well):

      pdfBaseName = os.path.basename(os.extsep.join([os.path.splitext(mxdPath)[0], "pdf"]))
      
    • Instead of:

      file = dir + os.sep + os.path.basename(name)
      

      Use os.path.join:

      pdfPath = os.path.join(outputFolder, pdfBaseName)
      

      (moved os.path.basename to previous line and changed your variable names as well)

  3. See PEP 8 - Style Guide for Python Code
  4. See Code Like a Pythonista: Idiomatic Python
  5. Use a real Python IDE, like PyScripter or Eclipse with PyDev. Use their interactive debuggers to step through your code, inspect variables, and generally get a better understanding of what is going on at any moment in your program.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.