当语法为来自另一个 Python 脚本的 运行 时,在 SPSS 中保留 Python 变量

Holding Python variables in SPSS when the Syntax is run from another Python script

在 SPSS 中,在 BEGIN 和 END PROGRAM 命令中使用 Python 创建的任何变量都将存储在内存中以供其余语法使用。但是,如果语法是从另一个 Python 命令从不同的语法调用的,那么创建的 Python 变量将仅存在于创建它的 BEGIN 和 END 程序中。例如:

在调用程序的 SPSS 插入脚本中:

BEGIN PROGRAM. 
import spss
spss.Submit ('''
INSERT FILE = '~~FILELOCATION~~'
        SYNTAX=INTERACTIVE ERROR=CONTINUE CD=NO.
    ''')
END PROGRAM. 

在 ~~FILE LOCATION~~ 被调用:

BEGIN PROGRAM.  
firstvar = "34"
END PROGRAM.

BEGIN PROGRAM.
secondvar = "23"
print(firstvar + secondvar)
END PROGRAM.

如果后一个脚本是 运行 来自第一个程序的插入文件命令,结果是第一个变量不会被带入第二个 BEGIN PROGRAM。

有没有办法将此变量存储在开始用于插入文件的 Python 程序的内存中,因为这里的任何变量都将存在于整个插入的语法中?如果这不可能,那么在插入文件命令中将在一个 Python 脚本中创建的变量传送到另一个脚本的最佳方法是什么。

我希望这是有道理的,如果您有任何疑问要澄清问题,请告诉我。

对我来说效果很好(尽管有非常小的改动)。

这是输出日志的打印回:

insert file="c:\temp\pytest.sps". 
  44  0  * Encoding: windows-1252. 
  45  0  BEGIN PROGRAM. 
  46  0  firstvar = "34" 
  47  0  print firstvar 
34 
  47  0  END PROGRAM. 
  48  0   
  49  0  BEGIN PROGRAM. 
  50  0  secondvar  = "23" 
  51  0  print secondvar 
23 
  51  0  END PROGRAM. 
  52  0   
  53  0  * End of INSERT and INCLUDE nesting level 01. 
BEGIN PROGRAM. 
print firstvar 
print secondvar 
END PROGRAM. 
34 
23

更新:

我现在也可以重现这个问题,并且很惊讶地也注意到了这一点。然而,有一个简单的解决方案是将 python 变量定义为 globals.

BEGIN PROGRAM.  
global firstvar
firstvar = "34"
END PROGRAM.

第一个程序正在创建一个名为 firstvar 的局部变量。您可以通过将其显式分配给它的模块来使其持久化到第二个程序中。这比将变量放入全局变量更有序。

导入系统
sys.modules[__name__].firstvar = 34

并将其称为
sys.modules[__name__].firstvar
在第二个节目中。