I've used sys.argv[0] 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[0] 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
..\\tbx_path\\scripts\
and you can parse off the module name (_npg) from the tool name (arcpy.AttributeSort_npg)
But what if you don't know the path to the toolbox? Say if the toolbox is being used by another user on a different machine.
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[0], 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[0] will include the toolbox in the path of the script tool. A bit of a clunky workaround, but may work in a pinch.