Greetings..I'm running a Python script in the Notebook environment and it works as expected. If I try to run as a standalone script in a Toolbox, it fails unexpectedly. Is there a difference, and what are the differences, between the Notebook runtime and the Script/Toolbox runtime?
Thanks
Solved! Go to Solution.
I think the issue is with the save() method on the project. Here is my minimal code:
import arcpy
p = arcpy.mp.ArcGISProject('current')
m = p.listMaps('Map')[0]
addTab = arcpy.mp.Table(r"C:\Scratch\fGDB_Scratch.gdb\London")
m.addTable(addTab)
# p.save() # This does not work!
p.saveACopy(r"C:\temp\Scott\Scott2.aprx")
arcpy.AddMessage("Saved!")
I connected the script to a tool script but as there are no input parameters the tool runs as this:
The Table is added as shown below:
Now if I use p.save() instead of p.saveACopy() then the table IS NOT saved to the project. This seems like a bug to me.
What's the error message?
Hey Duncan, thanks for the reply. I don't get an error message, just inconsistent behaviour. For instance, if I use the JoinField function in the Notebook environment between a feature and a table, it behaves as expected. If I run the same script as a Toolbox script, it does not error, completes as expected but fails to make, or maybe save, the join. Is there some automatic functionality in the Notebook environment that saves that join result for me that doesn't exist in the Toolbox environment?
I should add, this is early days for me in Python, so speak to me like I'm a Labrador Retriever... 🙂
Another thought..are the Environment settings different in the Notebook runtime vs the Script runtime? Things like, AutoCommit, Maintain Fully Qualified Field Names. Do I need to explicitly set these values or are they inherited from the APRX environment at runtime for both the Notebook and Tool Script environments?
Further information. I'm actually creating a table using the TableToTable Conversion function. The table gets created, is added to my local geodb, is added to my map and then joined to an existing feature. If i perform these tasks in the Notebook environment, the join is added successfully. If it do this in the Toolbox environment, it does not create/save the join. If the table already exists (ie I don't create it in my script..) then it will create and save the join correctly. So it would appear that something in the TableToTable conversion function is not the same in Notebook vs Toolbox. Is there some necessity to "save" the table in a special fashion to make it available to the subsequent calls in the Toolbox environment? It's successfully added to my geodb and map in the Toolbox environment but it fails to execute the join correctly. Fairly annoying...
So this is the same issue I believe.
https://community.esri.com/t5/python-questions/arcgis-pro-python-addjoin/td-p/1016171/page/2
Scott,
Without seeing your code it's difficult to offer up a solution. I have to confess I don't use the notebook environment, and see little use for it.
I would normally develop a script in an IDE such as spyder and either run it there directly or paste it into the python console or wire it up to a script tool interface, which sounds like what you are doing.
I would be surprised if notebook implements environmental settings in a different way to toolbox so my suspicion is that its a flaw in the code and if you shared it with some of your data and I too replicate the problem then that would be good evidence to log a bug with esri.
Thanks Duncan. I messed around last night doing some stuff and realized that my issue is likely the referencing of items in my current ArcPro session in the Notebook environment vs trying to access these items from a standalone script. I think this is a fundamental thing I have to understand better. For instance, in a standalone script, can i get a handle on the aprx, then a map, then add a layer in the map from a standalone script? Within the Notebook environment it's implicit where these things are going. From standalone, I'm not sure I'm accessing the map etc correctly to be able to add and modify layers.
Here is a little snippet. This fails to add the table when run as standalone. I'm not sure that I am addressing the aprx correctly and it's not able to add or save the table addition. Any insight would be great.
import arcpy
# set geodb to be worked on
arcpy.env.workspace = r"C:\LocalWork\SLN_Replacement\SLN_Replacement.gdb"
#aprx = arcpy.mp.ArcGISProject("CURRENT")
aprx = arcpy.mp.ArcGISProject(r"C:\LocalWork\SLN_Replacement\SLN_Replacement.aprx")
m = aprx.listMaps("Map")[0]
# get handle on table to add
addTab = arcpy.mp.Table(r"C:\LocalWork\SLN_Replacement\SLN_Replacement.gdb\AddressWorking")
# set flag
found = 0
# test for AddressWorking already in the Map and add if needed
tables = m.listTables()
print("Got tables list.")
if tables is not None:
for table in m.listTables():
if table.name == "AddressWorking":
print("Found AddressWorking.")
arcpy.AddMessage("Found AddressWorking.")
found = 1
if found == 0:
print("Adding AddressWorking.")
m.addTable(addTab)
# save aprx
aprx.save
# clean up
del aprx, m, tables, found
print("Done.")
arcpy.AddMessage("Done.")
When you say run as a "standalone script", how exactly are you doing that? Are you wiring it up to Tool script interface? If so I don't see you setting any parameters which would be expected as that is what a script tool is. Or are you running it in an IDE or python console outside ArcPro?