在 Linux 服务器上的 python 中调用 sas 代码时如何利用子进程

How to utilize subprocess when invoking sas code in python on Linux server

我正在尝试使用 python 在 linux 上 运行 一个 SAS 程序。此服务器已安装 SAS(版本 9.4)。 python 我的版本是 3.7.3.

我了解到有一个库 saspy 可以使用,但是我的项目无法访问该库。所以,我找到了另一种方案,我的本意是调用python中的sas程序,成功完成后得到return代码。这个 Sas 程序通常需要 1 小时才能完成。

所以,我想在成功时使用 return 代码,稍后想通过电子邮件通知自己。我写了下面的代码(示例),但我无法使子流程工作?任何帮助表示赞赏。谢谢

#!usr/bin/python 
import os
import subprocess
import time 
**My function begins here** 
def Trigger_func(T):
    if T == 1:
       start = time.time() /** want to start a timer to know how long it takes to complete*/
       #cmd = os.system('BGsas -p path/Sample.sas') /** SAS code is being invoked properly if used in this way */
       sas_script = 'path/Sample.sas' /* Just a variable for the sas code path */
       cmd2 = f'BGsas -p {sas_script}'
       result = subprocess.call(cmd2, shell=True) /* if I use this subprocess to call the sas code it is not working, I am getting the return code <> 0 **/
       if result == 0: 
             stop = time.time() - start
             return [1, stop]
       else:
            stop = time.time() - start 
            return [0, stop]


   """""""" 
   When the above process is completed, I will use this success return code to notify myself through 
   an email
   """"""""""""

    

subprocess.call 是执行此操作的较旧方法,但它应该有效;根据文档,您需要使用 returncode attribute 访问 return 代码。

您最好使用 subprocess.run(),它 return 是一个 CompletedProcess 实例。

无论哪种方式,您可能应该确保您的 shell 命令(看起来像一个 .bat 文件)实际上 returns 来自SAS 执行。如果它使用 call,例如(在 Windows 批处理脚本中),它实际上可能是 运行 SAS 在后台 - 这与你在这里描述的一致,并且也一致与文件名 (BGsas)。您可能希望使用不同的脚本在前台启动 SAS。

我将 sas 程序嵌入 shell 脚本中,然后在 python 中使用 p = subprocess.run(['sh', './path/shellscript 调用。 sh']) 并使用 p.returncode 进行进一步的操作。

我发现 BGsas 在我的案例中没有按预期工作。感谢 Joe 和 Tom 抽出时间。