Publishing file with tk-multi-publish2 from Nuke : PublishData has no attribute 'path'

Not sure if I’m at the right place to ask help for this, but I’m a bit desperate so here goes. We have a shot from which our artist cannot publish their file. It is the only shot on the project for which it’s doing that. In the publish gui log we have :
Error running accept for <PublishPluginInstance: {self}/publish_file.py>
With details stating :
Traceback (most recent call last):
File “/install/app_store/tk-multi-publish2/v2.5.5/python/tk_multi_publish2/api/plugins/publish_plugin_instance.py”, line 156, in run_accept
return self._hook_instance.accept(self.settings, item)
File “/install/app_store/tk-multi-publish2/v2.5.5/hooks/publish_file.py”, line 260, in accept
path = item.properties.path
AttributeError: ‘PublishData’ object has no attribute ‘path’
Tried a bunch of things, but only publishing a few frames from the plates give that result. Any idea what to check from here?
thanks

Is this from Nuke?
Do you have any customisations?
I would log out the path variable in the collector here to see what it’s getting : tk-multi-publish2/hooks/collector.py at 7bb30ecbd5383836a91a4fe5b3ffdbb1af13fbc7 · shotgunsoftware/tk-multi-publish2 · GitHub

Here’s the line where the path should be getting added to the item : tk-multi-publish2/hooks/collector.py at 7bb30ecbd5383836a91a4fe5b3ffdbb1af13fbc7 · shotgunsoftware/tk-multi-publish2 · GitHub

Hello Patrick, thank you for your input. It is indeed from Nuke. Turns out, the error log I pasted in not really the relevant one. I might have to close this post and create a new one, but this is actually the error that prevents the publish :
Traceback (most recent call last):
File “/fileserver/prod/SYSTEM/prod/sgtk/desktop/global/install/core/python/tank/util/shotgun/publish_creation.py”, line 262, in register_publish
sg_published_file_type = tk.shotgun.find_one(
File “/fileserver/prod/SYSTEM/prod/sgtk/desktop/global/install/core/python/tank_vendor/shotgun_api3/shotgun.py”, line 849, in find_one
results = self.find(entity_type, filters, fields, order, filter_operator, 1, retired_only,
File “/fileserver/prod/SYSTEM/prod/sgtk/desktop/global/install/core/python/tank_vendor/shotgun_api3/shotgun.py”, line 994, in find
records = self._call_rpc(“read”, params).get(“entities”, )
File “/fileserver/prod/SYSTEM/prod/sgtk/desktop/global/install/core/python/tank/authentication/shotgun_wrapper.py”, line 63, in _call_rpc
return super(ShotgunWrapper, self)._call_rpc(*args, **kwargs)
File “/fileserver/prod/SYSTEM/prod/sgtk/desktop/global/install/core/python/tank_vendor/shotgun_api3/shotgun.py”, line 3330, in _call_rpc
http_status, resp_headers, body = self._make_call(“POST”, self.config.api_path,
File “/fileserver/prod/SYSTEM/prod/sgtk/desktop/global/install/core/python/tank_vendor/shotgun_api3/shotgun.py”, line 3471, in _make_call
return self._http_request(verb, path, body, req_headers)
File “/fileserver/prod/SYSTEM/prod/sgtk/desktop/global/install/core/python/tank_vendor/shotgun_api3/shotgun.py”, line 3525, in _http_request
resp, content = conn.request(url, method=verb, body=body, headers=headers)
File “/fileserver/prod/SYSTEM/prod/sgtk/desktop/global/install/core/python/tank_vendor/shotgun_api3/lib/httplib2/python3/init.py”, line 1985, in request
(response, content) = self._request(
File “/fileserver/prod/SYSTEM/prod/sgtk/desktop/global/install/core/python/tank_vendor/shotgun_api3/lib/httplib2/python3/init.py”, line 1650, in _request
(response, content) = self._conn_request(
File “/fileserver/prod/SYSTEM/prod/sgtk/desktop/global/install/core/python/tank_vendor/shotgun_api3/lib/httplib2/python3/init.py”, line 1558, in _conn_request
conn.request(method, request_uri, body, headers)
File “/usr/local/Nuke15.1v5/lib/python3.10/http/client.py”, line 1282, in request
self._send_request(method, url, body, headers, encode_chunked)
File “/usr/local/Nuke15.1v5/lib/python3.10/http/client.py”, line 1328, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File “/usr/local/Nuke15.1v5/lib/python3.10/http/client.py”, line 1277, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File “/usr/local/Nuke15.1v5/lib/python3.10/http/client.py”, line 1037, in _send_output
self.send(msg)
File “/usr/local/Nuke15.1v5/lib/python3.10/http/client.py”, line 998, in send
self.sock.sendall(data)
File “/usr/local/Nuke15.1v5/lib/python3.10/ssl.py”, line 1237, in sendall
v = self.send(byte_view[count:])
File “/usr/local/Nuke15.1v5/lib/python3.10/ssl.py”, line 1206, in send
return self._sslobj.write(data)
ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:2396)
Previously the artists worked around that by publishing only a part of the framerange. So it might have to do with the length of the shot (800+ frames) somehow. Again, any pointers are helpful.

Almost seems like a firewall that intervenes with the SSL Connection, do you have a restritive firewall in place?

1 Like

We do have a firewall in place for exterior communications, but normally, any query to our shotgun “database” through the shotgun api works. And it works in 99% of the cases, so why would the firewall trip for that very instance?
Anyway, we finally tested with Nuke14 instead of Nuke15 (probably should’ve tested that earlier, but life’s too short for regrets) and the publish went ahead. So bottom line, we have a workaround. That being said, I’m generally keen on understanding what happened so it does not happen again.
I’m still puzzled as this behaviour is limited to that single shot of that project, and any potential explanation I come up with would make all the shots fail. I did find that the size of the data sent might play a role in the error we get, but why does it work in Nuke14 then.
All in all, thanks everyone for the pointers so far.

Well it depends on the exact version of Nuke but generally Nuke 14 runs python 3.9 and Nuke 15 runs Python 3.10.

Nuke 15.1 Runs Python 3.11.

So the SSL library between those will be a different version.