I've used sys.argv before to get the path to the current script tool being ran. However, I'm finding that if the script tool is inside of a toolset within the toolbox, sys.argv doesn't return anything. Is there a way to get the script tool path when it is inside of a toolset?
# --- carry on from before import arcpy pth = r"C:\arcpro_npg\npg_tools.tbx" t0 = arcpy.ImportToolbox(pth) t0.__pathname__ 'C:\\arcpro_npg\\npg_tools.tbx' # -- or tools = arcpy.ListTools('*_npg') tools ['AttributeSort_npg', ... snip ... 'Triangulate_npg'] t0.__pathname__ 'C:\\arcpro_npg\\npg_tools.tbx' c = arcpy.AttributeSort_npg.__code__ # --- get the code reference c.co_filename 'C:\\arcpro_npg\\npg_tools.tbx' # ---- # -- ..\tbx_tools.py
It stops at some point. Once I get the toolbox name from either of the methods. I know where the script is located since I store my scripts relate to the tbx path like
and you can parse off the module name (_npg) from the tool name (arcpy.AttributeSort_npg)
see lines 3, 4, 5 import the toolbox BUT that is as far as it goes.
The new format of toolboxes ( *.atbx ) has some more options that I have been exploring
Hmm, but wouldn't importing the toolbox require the user to specifically define its location first? I'm trying to avoid that.
The end goal here is to determine the path to the toolbox on the user's machine, without them having to define its location. This was easy with sys.argv, since I could just grab the parent directory of the script tool, but this method doesn't seem to be working for me when the script tool is inside of a toolset.
I'd be willing to convert the toolbox to the new format (.atbx), if that made this possible.
If you don't know where the user stores their toolboxes, then you will have a difficult job.
import sys sys.path ['C:\\arc_pro\\Resources\\ArcPy',... snip ...] # -- my stuff # 'C:\\Arc_projects', 'C:\\arcpro_npg',
which isn't going to help unless you want to remove path info normally present from that on a specific machine
You can use the python '_file_' variable to get the path to your .py file. From there you can back it up to the root of your toolbox. Here is an example of how I do it:
path_code_base = os.path.normpath(__file__ + '/../../../../')
I discovered that if you embed the script AND put a password on it, sys.argv will include the toolbox in the path of the script tool. A bit of a clunky workaround, but may work in a pinch.