Script Log warning due to advss-tmp-scriptN.py ModuleNotFoundError
Operating System Info
Ubuntu 24.04
Other OS
No response
OBS Studio Version
31.1.1
Advanced Scene Switcher Version
1.31.0
Plugin settings
No response
OBS Studio Log URL
No response
OBS Studio Crash Log URL
No response
Expected Behavior
Not receiving Script Log pop-up with an error from advss.
Current Behavior
I am getting a pop-up window upon starting OBS of the "Script Log" that contains this entry:
[advss-tmp-script4.py] ModuleNotFoundError: No module named 'advss-tmp-script4'
The number in the script name and the reported module name varies.
The detailed log from OBS in and around this is as follows:
info: [obs-scripting]: Loaded python script: advss-tmp-script1.py
info: [obs-scripting]: Unloaded python script: advss-tmp-script1.py
info: [obs-scripting]: Loaded python script: advss-tmp-script2.py
info: [obs-scripting]: Loaded python script: advss-tmp-script3.py
info: [obs-scripting]: Unloaded python script: advss-tmp-script3.py
warning: [Python] Python failure in load_python_script:189:
error: [Python: advss-tmp-script4.py] ModuleNotFoundError: No module named 'advss-tmp-script4'
info: [obs-scripting]: Loaded python script: advss-tmp-script5.py
info: [obs-scripting]: Unloaded python script: advss-tmp-script5.py
info: [obs-scripting]: Loaded python script: advss-tmp-script6.py
info: [obs-scripting]: Loaded python script: advss-tmp-script7.py
info: [obs-scripting]: Unloaded python script: advss-tmp-script7.py
info: [obs-scripting]: Loaded python script: advss-tmp-script8.py
Steps to Reproduce
This pops up when I open OBS.
Anything else we should know?
I have 4 script conditions in my setup which have these stanzas. All of these conditions are working properly.
{
"segmentSettings": {
"collapsed": false,
"useCustomLabel": false,
"customLabel": "My label",
"enabled": true,
"version": 1
},
"id": "script",
"logic": 101,
"durationModifier": {
"time_constraint": 0,
"seconds": {
"value": {
"value": 0,
"type": 0
},
"unit": 0,
"version": 1
}
},
"script": {
"type": 0,
"language": 2,
"scriptPython": "import os\nimport obspython as obs\n\ndef run():\n return os.path.exists(\"/home/XXX/replays/60s.mkv\")\n",
"scriptLUA": "obs = obslua\n\nfunction run()\n obs.script_log(obs.LOG_WARNING, \"Hello from LUA!\")\n return true\nend",
"file": ""
}
}
{
"segmentSettings": {
"collapsed": false,
"useCustomLabel": false,
"customLabel": "My label",
"enabled": true,
"version": 1
},
"id": "script",
"logic": 101,
"durationModifier": {
"time_constraint": 0,
"seconds": {
"value": {
"value": 0,
"type": 0
},
"unit": 0,
"version": 1
}
},
"script": {
"type": 0,
"language": 2,
"scriptPython": "import os\nimport obspython as obs\n\ndef run():\n return os.path.exists(\"/home/XXX/replays/10s.mkv\")\n",
"scriptLUA": "obs = obslua\n\nfunction run()\n obs.script_log(obs.LOG_WARNING, \"Hello from LUA!\")\n return true\nend",
"file": ""
}
}
{
"segmentSettings": {
"collapsed": false,
"useCustomLabel": false,
"customLabel": "My label",
"enabled": true,
"version": 1
},
"id": "script",
"logic": 101,
"durationModifier": {
"time_constraint": 0,
"seconds": {
"value": {
"value": 0,
"type": 0
},
"unit": 0,
"version": 1
}
},
"script": {
"type": 0,
"language": 2,
"scriptPython": "import os\nimport obspython as obs\n\ndef run():\n return os.path.exists(\"/home/XXX/replays/20s.mkv\")\n",
"scriptLUA": "obs = obslua\n\nfunction run()\n obs.script_log(obs.LOG_WARNING, \"Hello from LUA!\")\n return true\nend",
"file": ""
}
}
{
"segmentSettings": {
"collapsed": false,
"useCustomLabel": false,
"customLabel": "My label",
"enabled": true,
"version": 1
},
"id": "script",
"logic": 101,
"durationModifier": {
"time_constraint": 0,
"seconds": {
"value": {
"value": 0,
"type": 0
},
"unit": 0,
"version": 1
}
},
"script": {
"type": 0,
"language": 2,
"scriptPython": "import os\nimport obspython as obs\n\ndef run():\n return os.path.exists(\"/home/XXX/replays/30s.mkv\")\n",
"scriptLUA": "obs = obslua\n\nfunction run()\n obs.script_log(obs.LOG_WARNING, \"Hello from LUA!\")\n return true\nend",
"file": ""
}
}
There are no other references to "script" or python in the export of my AdvSS setup. It's curious that AdvSS seems to be trying to create 8 temporary scripts when I have only 4 in my setup?
Further information: There's definitely something weird going on here with the script injection into OBS. When I stop and restart OBS, and get the warning I mentioned in the log, one (random) of my python "file exists" scripts isn't working correctly. By this I mean that the file exists but the condition is not flashing green in AdvSS. So I click in the box and then outside of it, and the condition starts flashing green. I can confirm that the actions are properly triggered once the condition starts flashing green.
FWIW I have this to be 100% reliable and no Python errors or other errors that pop up the Script Log:
obs = obslua
function run()
local f = io.open("/home/XXX/replays/10s.mkv", "r")
return f and f:close() or false
end
Thanks for reporting the issue!
To be honest I don't yet fully understand what is failing here.
As far as I can tell the Python failure in load_python_script:189: failure likely happens when calling PyImport_ImportModule.
The No module named 'advss-tmp-script4' part means that the advss-tmp-script4.py file cannot be found.
But the file must exist since it is created just before CreateOBSScript is called, which then calls PyImport_ImportModule.
static bool createScriptFile(const char *settingsFile, const char *content)
{
const QFileInfo fileInfo(settingsFile);
const QString dirPath = fileInfo.absolutePath();
const QDir dir(dirPath);
if (!dir.exists() && !dir.mkpath(dirPath)) {
blog(LOG_WARNING, "could not create script file! (mkpath)");
return false;
}
QFile file(settingsFile);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
return false;
}
auto out = QTextStream(&file);
out << content;
return true;
}
void InlineScript::SetupInline()
{
const StringVariable &text =
_language == OBS_SCRIPT_LANG_PYTHON ? _textPython : _textLUA;
const auto scriptText = preprocessScriptText(text, _language, GetID());
auto path_ = getScriptTempFilePath(_language);
if (!path_) {
return;
}
auto path = GetLUACompatiblePath(*path_);
if (!createScriptFile(path.c_str(), scriptText.c_str())) {
return;
}
_script = std::unique_ptr<obs_script_t, ScriptDeleter>(
CreateOBSScript(path.c_str(), nullptr), {path});
_lastResolvedText = text;
}
Unfortunately, I also was not able to reproduce the issue yet, even with huge amounts of scripts:
21:03:08.278: Switched to scene 'Scene'
21:03:08.287: [obs-scripting]: Loaded python script: advss-tmp-script1.py
21:03:08.287: [obs-scripting]: Unloaded python script: advss-tmp-script1.py
21:03:08.292: [obs-scripting]: Loaded python script: advss-tmp-script2.py
21:03:08.298: [obs-scripting]: Loaded python script: advss-tmp-script3.py
21:03:08.298: [obs-scripting]: Unloaded python script: advss-tmp-script3.py
21:03:08.301: [obs-scripting]: Loaded python script: advss-tmp-script4.py
21:03:08.304: [obs-scripting]: Loaded python script: advss-tmp-script5.py
21:03:08.304: [obs-scripting]: Unloaded python script: advss-tmp-script5.py
21:03:08.309: [obs-scripting]: Loaded python script: advss-tmp-script6.py
21:03:08.313: [obs-scripting]: Loaded python script: advss-tmp-script7.py
21:03:08.313: [obs-scripting]: Unloaded python script: advss-tmp-script7.py
21:03:08.316: [obs-scripting]: Loaded python script: advss-tmp-script8.py
21:03:08.319: [obs-scripting]: Loaded python script: advss-tmp-script9.py
21:03:08.320: [obs-scripting]: Unloaded python script: advss-tmp-script9.py
21:03:08.323: [obs-scripting]: Loaded python script: advss-tmp-script10.py
21:03:08.326: [obs-scripting]: Loaded python script: advss-tmp-script11.py
21:03:08.326: [obs-scripting]: Unloaded python script: advss-tmp-script11.py
21:03:08.329: [Media Source 'Stinger (Stinger)']: settings:
21:03:08.329: input:
21:03:08.329: input_format: (null)
21:03:08.329: speed: 100
21:03:08.329: is_looping: no
21:03:08.329: is_linear_alpha: no
21:03:08.329: is_hw_decoding: yes
21:03:08.329: is_clear_on_media_end: yes
21:03:08.329: restart_on_activate: yes
21:03:08.329: close_when_inactive: no
21:03:08.329: full_decode: no
21:03:08.329: ffmpeg_options:
21:03:08.330: [obs-scripting]: Loaded python script: advss-tmp-script12.py
21:03:08.333: [obs-scripting]: Loaded python script: advss-tmp-script13.py
21:03:08.333: [obs-scripting]: Unloaded python script: advss-tmp-script13.py
21:03:08.342: [obs-scripting]: Loaded python script: advss-tmp-script14.py
21:03:08.345: [obs-scripting]: Loaded python script: advss-tmp-script15.py
21:03:08.346: [obs-scripting]: Unloaded python script: advss-tmp-script15.py
21:03:08.349: [obs-scripting]: Loaded python script: advss-tmp-script16.py
21:03:08.352: [obs-scripting]: Loaded python script: advss-tmp-script17.py
21:03:08.352: [obs-scripting]: Unloaded python script: advss-tmp-script17.py
21:03:08.356: [obs-scripting]: Loaded python script: advss-tmp-script18.py
21:03:08.359: [obs-scripting]: Loaded python script: advss-tmp-script19.py
21:03:08.359: [obs-scripting]: Unloaded python script: advss-tmp-script19.py
21:03:08.369: [obs-scripting]: Loaded python script: advss-tmp-script20.py
21:03:08.372: [obs-scripting]: Loaded python script: advss-tmp-script21.py
21:03:08.372: [obs-scripting]: Unloaded python script: advss-tmp-script21.py
21:03:08.375: [obs-scripting]: Loaded python script: advss-tmp-script22.py
21:03:08.378: [obs-scripting]: Loaded python script: advss-tmp-script23.py
21:03:08.379: [obs-scripting]: Unloaded python script: advss-tmp-script23.py
21:03:08.382: [obs-scripting]: Loaded python script: advss-tmp-script24.py
21:03:08.385: [obs-scripting]: Loaded python script: advss-tmp-script25.py
21:03:08.385: [obs-scripting]: Unloaded python script: advss-tmp-script25.py
21:03:08.389: [obs-scripting]: Loaded python script: advss-tmp-script26.py
21:03:08.392: [obs-scripting]: Loaded python script: advss-tmp-script27.py
21:03:08.392: [obs-scripting]: Unloaded python script: advss-tmp-script27.py
21:03:08.395: [obs-scripting]: Loaded python script: advss-tmp-script28.py
21:03:08.398: [obs-scripting]: Loaded python script: advss-tmp-script29.py
21:03:08.398: [obs-scripting]: Unloaded python script: advss-tmp-script29.py
21:03:08.402: [obs-scripting]: Loaded python script: advss-tmp-script30.py
21:03:08.405: [obs-scripting]: Loaded python script: advss-tmp-script31.py
21:03:08.405: [obs-scripting]: Unloaded python script: advss-tmp-script31.py
21:03:08.409: [obs-scripting]: Loaded python script: advss-tmp-script32.py
21:03:08.412: [obs-scripting]: Loaded python script: advss-tmp-script33.py
21:03:08.412: [obs-scripting]: Unloaded python script: advss-tmp-script33.py
21:03:08.416: [obs-scripting]: Loaded python script: advss-tmp-script34.py
21:03:08.419: [obs-scripting]: Loaded python script: advss-tmp-script35.py
21:03:08.420: [obs-scripting]: Unloaded python script: advss-tmp-script35.py
21:03:08.423: [obs-scripting]: Loaded python script: advss-tmp-script36.py
21:03:08.425: [obs-scripting]: Loaded python script: advss-tmp-script37.py
21:03:08.426: [obs-scripting]: Unloaded python script: advss-tmp-script37.py
21:03:08.429: [obs-scripting]: Loaded python script: advss-tmp-script38.py
21:03:08.433: [obs-scripting]: Loaded python script: advss-tmp-script39.py
21:03:08.433: [obs-scripting]: Unloaded python script: advss-tmp-script39.py
21:03:08.436: [obs-scripting]: Loaded python script: advss-tmp-script40.py
21:03:08.440: [obs-scripting]: Loaded python script: advss-tmp-script41.py
21:03:08.440: [obs-scripting]: Unloaded python script: advss-tmp-script41.py
21:03:08.443: [obs-scripting]: Loaded python script: advss-tmp-script42.py
21:03:08.446: [obs-scripting]: Loaded python script: advss-tmp-script43.py
21:03:08.446: [obs-scripting]: Unloaded python script: advss-tmp-script43.py
21:03:08.449: [obs-scripting]: Loaded python script: advss-tmp-script44.py
21:03:08.453: [obs-scripting]: Loaded python script: advss-tmp-script45.py
21:03:08.453: [obs-scripting]: Unloaded python script: advss-tmp-script45.py
21:03:08.456: [obs-scripting]: Loaded python script: advss-tmp-script46.py
21:03:08.458: [obs-scripting]: Loaded python script: advss-tmp-script47.py
21:03:08.459: [obs-scripting]: Unloaded python script: advss-tmp-script47.py
21:03:08.461: [obs-scripting]: Loaded python script: advss-tmp-script48.py
21:03:08.464: [obs-scripting]: Loaded python script: advss-tmp-script49.py
21:03:08.465: [obs-scripting]: Unloaded python script: advss-tmp-script49.py
21:03:08.468: [obs-scripting]: Loaded python script: advss-tmp-script50.py
21:03:08.471: [obs-scripting]: Loaded python script: advss-tmp-script51.py
21:03:08.471: [obs-scripting]: Unloaded python script: advss-tmp-script51.py
21:03:08.475: [obs-scripting]: Loaded python script: advss-tmp-script52.py
21:03:08.480: [obs-scripting]: Loaded python script: advss-tmp-script53.py
21:03:08.480: [obs-scripting]: Unloaded python script: advss-tmp-script53.py
21:03:08.484: [obs-scripting]: Loaded python script: advss-tmp-script54.py
21:03:08.486: [obs-scripting]: Loaded python script: advss-tmp-script55.py
21:03:08.487: [obs-scripting]: Unloaded python script: advss-tmp-script55.py
21:03:08.490: [obs-scripting]: Loaded python script: advss-tmp-script56.py
21:03:08.493: [obs-scripting]: Loaded python script: advss-tmp-script57.py
21:03:08.493: [obs-scripting]: Unloaded python script: advss-tmp-script57.py
21:03:08.496: [obs-scripting]: Loaded python script: advss-tmp-script58.py
21:03:08.499: [obs-scripting]: Loaded python script: advss-tmp-script59.py
21:03:08.499: [obs-scripting]: Unloaded python script: advss-tmp-script59.py
21:03:08.502: [obs-scripting]: Loaded python script: advss-tmp-script60.py
21:03:08.505: [obs-scripting]: Loaded python script: advss-tmp-script61.py
21:03:08.505: [obs-scripting]: Unloaded python script: advss-tmp-script61.py
21:03:08.508: [obs-scripting]: Loaded python script: advss-tmp-script62.py
21:03:08.511: [obs-scripting]: Loaded python script: advss-tmp-script63.py
21:03:08.512: [obs-scripting]: Unloaded python script: advss-tmp-script63.py
21:03:08.515: [obs-scripting]: Loaded python script: advss-tmp-script64.py
21:03:08.517: [obs-scripting]: Loaded python script: advss-tmp-script65.py
21:03:08.518: [obs-scripting]: Unloaded python script: advss-tmp-script65.py
21:03:08.520: [obs-scripting]: Loaded python script: advss-tmp-script66.py
21:03:08.528: [obs-scripting]: Loaded python script: advss-tmp-script67.py
21:03:08.528: [obs-scripting]: Unloaded python script: advss-tmp-script67.py
21:03:08.532: [obs-scripting]: Loaded python script: advss-tmp-script68.py
21:03:08.535: [obs-scripting]: Loaded python script: advss-tmp-script69.py
21:03:08.536: [obs-scripting]: Unloaded python script: advss-tmp-script69.py
21:03:08.540: [obs-scripting]: Loaded python script: advss-tmp-script70.py
21:03:08.543: [obs-scripting]: Loaded python script: advss-tmp-script71.py
21:03:08.543: [obs-scripting]: Unloaded python script: advss-tmp-script71.py
21:03:08.546: [obs-scripting]: Loaded python script: advss-tmp-script72.py
21:03:08.549: [obs-scripting]: Loaded python script: advss-tmp-script73.py
21:03:08.549: [obs-scripting]: Unloaded python script: advss-tmp-script73.py
21:03:08.552: [obs-scripting]: Loaded python script: advss-tmp-script74.py
21:03:08.555: [obs-scripting]: Loaded python script: advss-tmp-script75.py
21:03:08.555: [obs-scripting]: Unloaded python script: advss-tmp-script75.py
21:03:08.559: [obs-scripting]: Loaded python script: advss-tmp-script76.py
21:03:08.562: [obs-scripting]: Loaded python script: advss-tmp-script77.py
21:03:08.562: [obs-scripting]: Unloaded python script: advss-tmp-script77.py
21:03:08.565: [obs-scripting]: Loaded python script: advss-tmp-script78.py
21:03:08.568: [obs-scripting]: Loaded python script: advss-tmp-script79.py
21:03:08.568: [obs-scripting]: Unloaded python script: advss-tmp-script79.py
21:03:08.571: [obs-scripting]: Loaded python script: advss-tmp-script80.py
21:03:08.576: [obs-scripting]: Loaded python script: advss-tmp-script81.py
21:03:08.576: [obs-scripting]: Unloaded python script: advss-tmp-script81.py
21:03:08.580: [obs-scripting]: Loaded python script: advss-tmp-script82.py
21:03:08.583: [obs-scripting]: Loaded python script: advss-tmp-script83.py
21:03:08.583: [obs-scripting]: Unloaded python script: advss-tmp-script83.py
21:03:08.586: [obs-scripting]: Loaded python script: advss-tmp-script84.py
21:03:08.590: [obs-scripting]: Loaded python script: advss-tmp-script85.py
21:03:08.590: [obs-scripting]: Unloaded python script: advss-tmp-script85.py
21:03:08.593: [obs-scripting]: Loaded python script: advss-tmp-script86.py
21:03:08.597: [obs-scripting]: Loaded python script: advss-tmp-script87.py
21:03:08.597: [obs-scripting]: Unloaded python script: advss-tmp-script87.py
21:03:08.600: [obs-scripting]: Loaded python script: advss-tmp-script88.py
21:03:08.603: [obs-scripting]: Loaded python script: advss-tmp-script89.py
21:03:08.603: [obs-scripting]: Unloaded python script: advss-tmp-script89.py
21:03:08.606: [obs-scripting]: Loaded python script: advss-tmp-script90.py
21:03:08.609: [obs-scripting]: Loaded python script: advss-tmp-script91.py
21:03:08.610: [obs-scripting]: Unloaded python script: advss-tmp-script91.py
21:03:08.612: [obs-scripting]: Loaded python script: advss-tmp-script92.py
21:03:08.615: [obs-scripting]: Loaded python script: advss-tmp-script93.py
21:03:08.616: [obs-scripting]: Unloaded python script: advss-tmp-script93.py
21:03:08.624: [obs-scripting]: Loaded python script: advss-tmp-script94.py
21:03:08.628: [obs-scripting]: Loaded python script: advss-tmp-script95.py
21:03:08.628: [obs-scripting]: Unloaded python script: advss-tmp-script95.py
21:03:08.631: [obs-scripting]: Loaded python script: advss-tmp-script96.py
21:03:08.634: [obs-scripting]: Loaded python script: advss-tmp-script97.py
21:03:08.635: [obs-scripting]: Unloaded python script: advss-tmp-script97.py
21:03:08.638: [obs-scripting]: Loaded python script: advss-tmp-script98.py
21:03:08.641: [obs-scripting]: Loaded python script: advss-tmp-script99.py
21:03:08.642: [obs-scripting]: Unloaded python script: advss-tmp-script99.py
21:03:08.645: [obs-scripting]: Loaded python script: advss-tmp-script100.py
21:03:08.648: [obs-scripting]: Loaded python script: advss-tmp-script101.py
21:03:08.648: [obs-scripting]: Unloaded python script: advss-tmp-script101.py
21:03:08.651: [obs-scripting]: Loaded python script: advss-tmp-script102.py
21:03:08.654: [obs-scripting]: Loaded python script: advss-tmp-script103.py
21:03:08.655: [obs-scripting]: Unloaded python script: advss-tmp-script103.py
21:03:08.658: [obs-scripting]: Loaded python script: advss-tmp-script104.py
21:03:08.661: [obs-scripting]: Loaded python script: advss-tmp-script105.py
21:03:08.661: [obs-scripting]: Unloaded python script: advss-tmp-script105.py
21:03:08.664: [obs-scripting]: Loaded python script: advss-tmp-script106.py
21:03:08.677: ------------------------------------------------
But I will keep digging when I find the time to.
Which python version are you using in OBS?
It's curious that AdvSS seems to be trying to create 8 temporary scripts when I have only 4 in my setup?
This is expected. When constructing the script macro segments, they are initially created using default settings, which triggers the generation of the first temporary script. When the "real" settings are being loaded the script text changes and thus a new temporary script has be be generated.