@@ -104,16 +104,26 @@ class TranslatorBaseWrapper
104104 std::size_t generateUniqueKey (const UsdPrim& prim) const override
105105 {
106106 if (Override o = GetOverride (" generateUniqueKey" )) {
107+ // Acquire Python lock before making any Python calls
108+ TfPyLock pyLock;
109+
110+ // Call the Python function with proper exception handling
107111 auto res = std::function<PXR_BOOST_PYTHON_NAMESPACE::object (const UsdPrim&)>(
108112 TfPyCall<PXR_BOOST_PYTHON_NAMESPACE ::object>(o))(prim);
109- if (!res) {
113+
114+ // Check if the result is valid (not None or null)
115+ if (!res || res.is_none ()) {
110116 return 0 ;
111117 }
112- TfPyLock pyLock;
118+
113119 PXR_BOOST_PYTHON_NAMESPACE ::str strObj (res);
114120 PXR_BOOST_PYTHON_NAMESPACE ::extract<std::string> strValue (strObj);
115121 if (strValue.check ()) {
116- return std::hash<std::string> {}(strValue);
122+ std::string keyStr = strValue ();
123+ // Ensure we don't hash empty strings
124+ if (!keyStr.empty ()) {
125+ return std::hash<std::string> {}(keyStr);
126+ }
117127 }
118128 }
119129 return 0 ;
@@ -155,6 +165,7 @@ class TranslatorBaseWrapper
155165 // "import" is a python keyword so python's override will be called
156166 // "importObject" instead
157167 if (Override o = GetOverride (" importObject" )) {
168+ TfPyLock pyLock;
158169 MDagPath path;
159170 MDagPath::getAPathTo (parent, path);
160171
@@ -170,7 +181,8 @@ class TranslatorBaseWrapper
170181 MStatus postImport (const UsdPrim& prim) override
171182 {
172183 if (Override o = GetOverride (" postImport" )) {
173- auto res = std::function<bool (const UsdPrim&)>(TfPyCall<bool >(o))(prim);
184+ TfPyLock pyLock;
185+ auto res = std::function<bool (const UsdPrim&)>(TfPyCall<bool >(o))(prim);
174186 return res ? MS ::kSuccess : MS ::kFailure ;
175187 }
176188 return MS ::kSuccess ;
@@ -233,6 +245,7 @@ class TranslatorBaseWrapper
233245 std::string name (dagPath.fullPathName ().asChar ());
234246 // pass a dagPath name and dictionary of params to the python method
235247 if (Override o = GetOverride (" exportObject" )) {
248+ TfPyLock pyLock;
236249 return std::function<UsdPrim (
237250 UsdStageRefPtr, const char *, SdfPath, PXR_BOOST_PYTHON_NAMESPACE ::dict)>(
238251 TfPyCall<UsdPrim>(o))(stage, name.c_str (), usdPath, pyParams);
0 commit comments