View Issue Details

IDProjectCategoryView StatusLast Update
0003549Slicer4Core: Scripting (Wrapping, Python)public2018-03-02 11:06
Reporterjcfr Assigned Tojcfr  
PrioritynormalSeverityminorReproducibilityhave not tried
Status closedResolutionfixed 
Product Version 
Target VersionSlicer 4.5.0-1Fixed in VersionSlicer 4.5.0-1 
Summary0003549: Import scripted module as python module
Description

Doing so will reduce the size of the global dict by NOT executing the script in the global scope.

TagsNo tags attached.

Relationships

related to 0001365 resolvedjcfr QTScriptedModules - Add support for init.py 

Activities

blowekamp

blowekamp

2014-01-08 10:18

developer   ~0010494

I brought this issue up on the slicer-devel list:
http://slicer-devel.65872.n3.nabble.com/ScriptedModules-executed-in-global-scope-tt4029406.html#none

This was my proposed fix:

$ git diff
diff --git a/Base/QTGUI/qSlicerScriptedLoadableModule.cxx b/Base/QTGUI/qSlicerScriptedLoadableModule.cxx
index 9c47efd..149eca4 100644
--- a/Base/QTGUI/qSlicerScriptedLoadableModule.cxx
+++ b/Base/QTGUI/qSlicerScriptedLoadableModule.cxx
@@ -154,7 +154,8 @@ bool qSlicerScriptedLoadableModule::setPythonSource(const QString& newPythonSour
if (!classToInstantiate)
{
PyDict_SetItemString(global_dict, "name", PyString_FromString(className.toLatin1()));

  • PyObject * pyRes = PyRun_String(QString("execfile('%1')").arg(newPythonSource).toLatin1(),
  • const char *code="import imp;%2=imp.load_source('%2','%1').%2";
  • PyObject * pyRes = PyRun_String(QString(code).arg(newPythonSource,className).toLatin1(),
    Py_file_input, global_dict, global_dict);
    if (!pyRes)
    {
jcfr

jcfr

2015-04-03 17:07

administrator   ~0013008

Fixed in r24155 [1]

[1] http://viewvc.slicer.org/viewvc.cgi/Slicer4?view=revision&revision=24155

Related Changesets

Import 2017-06-07 23:51:09: master ae86bb68

2015-04-02 14:05:13

fedorov

Details Diff
ENH: update MultiVolumeImporter

Fix from jcfr@github: Rename lib module to 'MultiVolumeImporterLib'. This will avoid conflict when Slicer issue 0003549 (Import scripted module as python module) will be addressed.


git-svn-id: http://svn.slicer.org/Slicer4/trunk@24145 3bd1e089-480b-0410-8dfb-8563597acbee
mod - SuperBuild.cmake Diff File

Import 2017-06-07 23:51:09: master fcdc7091

2015-04-02 15:08:53

jcfr

Details Diff
STYLE: VectorToScalarVolume - Make sure all required object are imported

This will avoid issue when addressing issue 0003549 (Import scripted module as python
module )

git-svn-id: http://svn.slicer.org/Slicer4/trunk@24148 3bd1e089-480b-0410-8dfb-8563597acbee
mod - Modules/Scripted/VectorToScalarVolume/VectorToScalarVolume.py Diff File

Import 2017-06-07 23:51:09: master f17c8acf

2015-04-02 15:44:30

jcfr

Details Diff
BUG: Ensure "qSlicerScriptedUtils::executeFile()" set "__file__" property.

This is a hack. Instead the "imp" module should be used as outline
in issue 0003549 (Import scripted module as python module).

git-svn-id: http://svn.slicer.org/Slicer4/trunk@24149 3bd1e089-480b-0410-8dfb-8563597acbee
mod - Base/QTCore/Testing/Python/qSlicerModuleGenericTest.py.in Diff File
mod - Base/QTCore/qSlicerScriptedUtils.cxx Diff File

Import 2017-06-07 23:51:09: master 941fad8e

2015-04-03 20:42:23

jcfr

Details Diff
ENH: Add test illustrating issue 0003549 related to scripted module import

The test is currently passing but comment in the script explain which
behavior is really expected.

In a nutshell, scripted module shouldn't be executed in the global scope
but should instead be imported as module.

git-svn-id: http://svn.slicer.org/Slicer4/trunk@24154 3bd1e089-480b-0410-8dfb-8563597acbee
mod - Applications/SlicerApp/Testing/Python/CMakeLists.txt Diff File
add - Applications/SlicerApp/Testing/Python/ScriptedModuleDiscoveryTest.py Diff File
add - Applications/SlicerApp/Testing/Python/ScriptedModuleDiscoveryTest/ModuleA.py Diff File
add - Applications/SlicerApp/Testing/Python/ScriptedModuleDiscoveryTest/ModuleB.py Diff File

Import 2017-06-07 23:51:09: master e5cf5fec

2015-04-03 20:42:28

jcfr

Details Diff
ENH: Fixes 0003549. Import scripted module as python module

This will allow each scripted module to defined top-level variables that
will not clobber each other.

For example, if we consider these two modules:

8<----8<----8<----8<----8<----8<----8<----8<----
File: ModuleA.py

FOO = 1

class ModuleA(ScriptedLoadableModule):
def __init__(self, parent):
ModuleA.__init__(self, parent)
[...]
def doSomething(self):
if FOO == 1:
[...]
else:
[...]
8<----8<----8<----8<----8<----8<----8<----8<----

8<----8<----8<----8<----8<----8<----8<----8<----
File: ModuleB.py

FOO = 2

class ModuleB(ScriptedLoadableModule):
def __init__(self, parent):
ModuleB.__init__(self, parent)
[...]
def doSomething(self):
if FOO == 1:
[...]
else:
[...]
8<----8<----8<----8<----8<----8<----8<----8<----

Assuming ModuleA, and then ModuleB are imported. Before this commit,
both scripts were executed in the __main__ scope and FOO variable would
have the value associated with the last imported module.

After this commit, both module will see their own copy of the FOO
variable with the expected value.

It also avoid the hack when we explicitly save/set/restore
both "__name__" and "__file__" variable.

Changes to "DICOMScalarVolumePlugin" fixes the test failing test
"py_RSNAVisTutorial" and "py_SubjectHierarchyGenericSelfTest". It basically
fixes the following error by ensuring all object are imported:

//--------------
test_SubjectHierarchyGenericSelfTest_FullTest1 (SubjectHierarchyGenericSelfTest.SubjectHierarchyGenericSelfTestTest) ... Traceback (most recent call last):
File "/path/to/Slicer-build/lib/Slicer-4.4/qt-scripted-modules/DICOMLib/DICOMWidgets.py", line 615, in getLoadablesFromFileLists
loadablesByPlugin[plugin] = plugin.examineForImport(fileLists)
File "/path/to/Slicer-build/lib/Slicer-4.4/qt-scripted-modules/DICOMScalarVolumePlugin.py", line 47, in examineForImport
loadablesForFiles = self.examineFiles(files)
File "/path/to/Slicer-build/lib/Slicer-4.4/qt-scripted-modules/DICOMScalarVolumePlugin.py", line 71, in examineFiles
loadable = DICOMLib.DICOMLoadable()
NameError: global name 'DICOMLib' is not defined
//--------------

git-svn-id: http://svn.slicer.org/Slicer4/trunk@24155 3bd1e089-480b-0410-8dfb-8563597acbee
mod - Applications/SlicerApp/Testing/Python/ScriptedModuleDiscoveryTest.py Diff File
add - Applications/SlicerApp/Testing/Python/ScriptedModuleDiscoveryTest/ModuleC_WithoutWidget.py Diff File
add - Applications/SlicerApp/Testing/Python/ScriptedModuleDiscoveryTest/ModuleD_WithFileDialog_WithoutWidget.py Diff File
add - Applications/SlicerApp/Testing/Python/ScriptedModuleDiscoveryTest/ModuleE_WithFileWriter_WithoutWidget.py Diff File
mod - Base/QTCore/qSlicerScriptedFileWriter.cxx Diff File
mod - Base/QTCore/qSlicerScriptedUtils.cxx Diff File
mod - Base/QTCore/qSlicerScriptedUtils_p.h Diff File
mod - Base/QTGUI/qSlicerScriptedFileDialog.cxx Diff File
mod - Base/QTGUI/qSlicerScriptedLoadableModule.cxx Diff File
mod - Base/QTGUI/qSlicerScriptedLoadableModuleWidget.cxx Diff File
mod - Modules/Scripted/DICOMPlugins/DICOMScalarVolumePlugin.py Diff File

Import 2017-06-07 23:51:09: master 002a4a7d

2015-10-08 13:15:57

jcfr

Details Diff
STYLE: Update python scripts to not import from __main__

This commit simplifies the scripts removing extra `from __main__`
statements and improve the integration with Python IDE ensuring python
package like "slicer" can simply be imported.

The `from __main__` statement most likely became obsolete since
r24155 (ENH: Fixes 0003549. Import scripted module as python module).

Remarks:

A global replace of "from __main__ import" into "import" as been done
except in:
* EditOptions: "from __main__ getNodes" changed into "from slicer.util import getNodes"
* slicer/module[dm|logic|mrml|widget]/__init__.py where it makes sense to keep it.

git-svn-id: http://svn.slicer.org/Slicer4/trunk@24622 3bd1e089-480b-0410-8dfb-8563597acbee
mod - Applications/SlicerApp/Testing/Python/AtlasTests.py Diff File
mod - Applications/SlicerApp/Testing/Python/Charting.py Diff File
mod - Applications/SlicerApp/Testing/Python/DTINotReproducibleIssue3977.py Diff File
mod - Applications/SlicerApp/Testing/Python/FiducialLayoutSwitchBug1914.py Diff File
mod - Applications/SlicerApp/Testing/Python/JRC2013Vis.py Diff File
mod - Applications/SlicerApp/Testing/Python/RSNA2012ProstateDemo.py Diff File
mod - Applications/SlicerApp/Testing/Python/RSNAQuantTutorial.py Diff File
mod - Applications/SlicerApp/Testing/Python/RSNAVisTutorial.py Diff File
mod - Applications/SlicerApp/Testing/Python/ScenePerformance.py Diff File
mod - Applications/SlicerApp/Testing/Python/SliceLinkLogic.py Diff File
mod - Applications/SlicerApp/Testing/Python/Slicer4Minute.py Diff File
mod - Applications/SlicerApp/Testing/Python/SubjectHierarchyCorePluginsSelfTest.py Diff File
mod - Applications/SlicerApp/Testing/Python/SubjectHierarchyGenericSelfTest.py Diff File
mod - Applications/SlicerApp/Testing/Python/ViewControllersSliceInterpolationBug1926.py Diff File
mod - Applications/SlicerApp/Testing/Python/fiber_visibility_crash2438.py Diff File
mod - Applications/SlicerApp/Testing/Python/sceneImport2428.py Diff File
mod - Applications/SlicerApp/Testing/Python/slicerCloseCrashBug2590.py Diff File
mod - Applications/SlicerApp/Testing/Python/test_tractography_display.py Diff File
mod - Base/Python/slicer/ScriptedLoadableModule.py Diff File
mod - Base/Python/slicer/util.py Diff File
mod - Base/Python/tpycl/tpycl.py Diff File
mod - Extensions/Testing/EditorExtensionTemplate/EditorEffectTemplate/EditorEffectTemplate.py Diff File
mod - Extensions/Testing/ScriptedLoadableExtensionTemplate/ScriptedLoadableModuleTemplate/ScriptedLoadableModuleTemplate.py Diff File
mod - Modules/Loadable/Colors/Testing/Python/ColorsScalarBarSelfTest.py Diff File
mod - Modules/Loadable/CropVolume/Testing/Python/CropVolumeSelfTest.py Diff File
mod - Modules/Loadable/Markups/Testing/Python/AddManyMarkupsFiducialTest.py Diff File
mod - Modules/Loadable/Markups/Testing/Python/MarkupsInCompareViewersSelfTest.py Diff File
mod - Modules/Loadable/Markups/Testing/Python/MarkupsInViewsSelfTest.py Diff File
mod - Modules/Loadable/Markups/Testing/Python/NeurosurgicalPlanningTutorialMarkupsSelfTest.py Diff File
mod - Modules/Loadable/SceneViews/Testing/Python/AddStorableDataAfterSceneViewTest.py Diff File
mod - Modules/Loadable/VolumeRendering/Testing/Python/VolumeRenderingSceneClose.py Diff File
mod - Modules/Scripted/DICOM/DICOM.py Diff File
mod - Modules/Scripted/DICOM2FullBrainTractography/DICOM2FullBrainTractography.py Diff File
mod - Modules/Scripted/DICOMLib/DICOMExportScalarVolume.py Diff File
mod - Modules/Scripted/DICOMLib/DICOMExportScene.py Diff File
mod - Modules/Scripted/DICOMLib/DICOMPlugin.py Diff File
mod - Modules/Scripted/DICOMLib/DICOMProcesses.py Diff File
mod - Modules/Scripted/DICOMLib/DICOMWidgets.py Diff File
mod - Modules/Scripted/DICOMPlugins/DICOMDiffusionVolumePlugin.py Diff File
mod - Modules/Scripted/DICOMPlugins/DICOMScalarVolumePlugin.py Diff File
mod - Modules/Scripted/DICOMPlugins/DICOMSlicerDataBundlePlugin.py Diff File
mod - Modules/Scripted/DataProbe/DataProbe.py Diff File
mod - Modules/Scripted/DataProbe/DataProbeLib/SliceViewAnnotations.py Diff File
mod - Modules/Scripted/Editor/Editor.py Diff File
mod - Modules/Scripted/EditorLib/ChangeIslandEffect.py Diff File
mod - Modules/Scripted/EditorLib/ChangeLabelEffect.py Diff File
mod - Modules/Scripted/EditorLib/ColorBox.py Diff File
mod - Modules/Scripted/EditorLib/DilateEffect.py Diff File
mod - Modules/Scripted/EditorLib/DrawEffect.py Diff File
mod - Modules/Scripted/EditorLib/EditBox.py Diff File
mod - Modules/Scripted/EditorLib/EditColor.py Diff File
mod - Modules/Scripted/EditorLib/EditOptions.py Diff File
mod - Modules/Scripted/EditorLib/Effect.py Diff File
mod - Modules/Scripted/EditorLib/ErodeEffect.py Diff File
mod - Modules/Scripted/EditorLib/FastMarchingEffect.py Diff File
mod - Modules/Scripted/EditorLib/GrowCutEffect.py Diff File
mod - Modules/Scripted/EditorLib/HelperBox.py Diff File
mod - Modules/Scripted/EditorLib/IdentifyIslandsEffect.py Diff File
mod - Modules/Scripted/EditorLib/IslandEffect.py Diff File
mod - Modules/Scripted/EditorLib/LabelEffect.py Diff File
mod - Modules/Scripted/EditorLib/LevelTracingEffect.py Diff File
mod - Modules/Scripted/EditorLib/MakeModelEffect.py Diff File
mod - Modules/Scripted/EditorLib/MorphologyEffect.py Diff File
mod - Modules/Scripted/EditorLib/PaintEffect.py Diff File
mod - Modules/Scripted/EditorLib/RectangleEffect.py Diff File
mod - Modules/Scripted/EditorLib/RemoveIslandsEffect.py Diff File
mod - Modules/Scripted/EditorLib/SaveIslandEffect.py Diff File
mod - Modules/Scripted/EditorLib/ThresholdEffect.py Diff File
mod - Modules/Scripted/EditorLib/WandEffect.py Diff File
mod - Modules/Scripted/EditorLib/WatershedFromMarkerEffect.py Diff File
mod - Modules/Scripted/Endoscopy/Endoscopy.py Diff File
mod - Modules/Scripted/ExtensionWizard/ExtensionWizard.py Diff File
mod - Modules/Scripted/ExtensionWizard/ExtensionWizardLib/CreateComponentDialog.py Diff File
mod - Modules/Scripted/ExtensionWizard/ExtensionWizardLib/DirectoryListWidget.py Diff File
mod - Modules/Scripted/ExtensionWizard/ExtensionWizardLib/EditExtensionMetadataDialog.py Diff File
mod - Modules/Scripted/ExtensionWizard/ExtensionWizardLib/EditableTreeWidget.py Diff File
mod - Modules/Scripted/ExtensionWizard/ExtensionWizardLib/LoadModulesDialog.py Diff File
mod - Modules/Scripted/ExtensionWizard/ExtensionWizardLib/ModuleInfo.py Diff File
mod - Modules/Scripted/ExtensionWizard/ExtensionWizardLib/SettingsPanel.py Diff File
mod - Modules/Scripted/ExtensionWizard/ExtensionWizardLib/TemplatePathUtilities.py Diff File
mod - Modules/Scripted/FiberBundleToLabelMap/FiberBundleToLabelMap.py Diff File
mod - Modules/Scripted/LabelStatistics/LabelStatistics.py Diff File
mod - Modules/Scripted/PerformanceTests/PerformanceTests.py Diff File
mod - Modules/Scripted/SampleData/SampleData.py Diff File
mod - Modules/Scripted/SelfTests/SelfTests.py Diff File
mod - Modules/Scripted/SurfaceToolbox/SurfaceToolbox.py Diff File
mod - Modules/Scripted/VectorToScalarVolume/VectorToScalarVolume.py Diff File
mod - Utilities/Scripts/qrcc.py Diff File
mod - Utilities/Templates/Modules/Scripted/TemplateKey.py Diff File

Issue History

Date Modified Username Field Change
2014-01-08 10:16 jcfr New Issue
2014-01-08 10:16 jcfr Status new => assigned
2014-01-08 10:16 jcfr Assigned To => jcfr
2014-01-08 10:16 jcfr Relationship added related to 0001365
2014-01-08 10:17 jcfr Target Version => Slicer 4.4.0
2014-01-08 10:18 jcfr Target Version Slicer 4.4.0 => Slicer 4.5.0-1
2014-01-08 10:18 blowekamp Note Added: 0010494
2014-03-07 10:28 jcfr Status assigned => acknowledged
2015-04-03 17:07 jcfr Note Added: 0013008
2015-04-03 17:07 jcfr Status acknowledged => resolved
2015-04-03 17:07 jcfr Fixed in Version => Slicer 4.4.1
2015-04-03 17:07 jcfr Resolution open => fixed
2015-09-09 08:29 jcfr Fixed in Version Slicer 4.4.1 => Slicer 4.5.0-1
2017-06-10 08:51 jcfr Changeset attached => Slicer master 002a4a7d
2017-06-10 08:51 jcfr Changeset attached => Slicer master e5cf5fec
2017-06-10 08:51 jcfr Changeset attached => Slicer master 941fad8e
2017-06-10 08:51 jcfr Changeset attached => Slicer master f17c8acf
2017-06-10 08:51 jcfr Changeset attached => Slicer master fcdc7091
2017-06-10 08:51 fedorov Changeset attached => Slicer master ae86bb68
2018-03-02 11:06 jcfr Status resolved => closed