gpt4 book ai didi

python - 在 Windows 中从 SAS 捕获 stdout 和 stderr?

转载 作者:太空狗 更新时间:2023-10-30 01:23:55 24 4
gpt4 key购买 nike

我想从 Windows 上的另一个程序调用 SAS 程序。我有一些以批处理模式从命令行调用 SAS 的经验,但没有从中接收消息和处理这些消息的实际经验。我用谷歌搜索了一下,发现了很多关于从 SAS 程序中从 stdin 读取的信息,但我似乎无法弄清楚如何让我的 SAS 程序写出到 stdout 或 stderr。我什至可以在 Windows 中执行此操作吗?

在 SAS 程序中,我想执行以下操作:

  • 将警告消息和错误消息重定向到 stderr,而不是将它们打印到日志文件
  • 在 SAS 程序中,手动检测错误和/或其他问题并将它们输出到 stderr 或 stdout。

这是我尝试过的:

SAS

data test;
attrib i length=8;

do i = 1 to 10;
put 'putting'; *how can i make this go to stdout?;
putlog 'putting to log'; *this can go to the log - that is okay;
if i = 5 then do;
*pretend this is an error I am manually detecting - how can i make this go to stderr?;
put 'we found 5';
end;
output;
end;
run;

data _null_;

1 = y; *this is an error detected by SAS. How can I make this go to stderr?;

run;

调用 SAS 的 Python:

import subprocess
import os


if __name__ == '__main__':

filename = os.path.normpath(r'C:\Users\oob\Desktop\sas_python_test.sas')
sas_executable = os.path.normpath(r'C:\Program Files\SAS\SASFoundation\9.2\sas.exe')

cmd = r'"' + sas_executable + r'"' + " " + r'"' + filename + r'"'

p = subprocess.Popen(cmd,shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print p.communicate()

我在控制台上的结果是:

('', '')

最佳答案

据我所知,这是不可能直接实现的。您可以通过使用 -sysparm 命令行参数将唯一文件名传递到 sas 并将 STDOUT 输出保存到该文件来模拟这一点。然后您可以使用 -log 命令行参数将 sas 日志发送到不同的文件。 SAS 程序完成后,您将能够使用您选择的程序来解析生成的每个文件。不幸的是,日志文件在 sas 程序完成处理之前一直处于锁定状态,因此如果您想使用 SAS 处理日志文件,您将需要启动第二个后续程序来执行此操作。 (即,您无法从创建它的 SAS 程序中读取日志文件)。

一旦您阅读日志,您就可以查找以 ERROR: 或 WARNING: 开头的行,并采取适当的措施(在我的情况下,它会向我发送电子邮件)。您可能想要添加一些适合您的编码风格的逻辑。例如,一些 SAS 视为 NOTES 的东西我认为是 ERRORS。另外,有些 SAS 认为我不关心的错误。这是我使用的逻辑:

data problems log;
length line $1000;

infile "&logfile";
input;

logfile = "&logfile";
line_no = _n_;
line = _infile_;
problem = 0;

if
(
line =: "ERROR:"
or line =: "WARNING:"
or line =: "NOTE: Numeric values have been converted to character values"
or line =: "NOTE: Character values have been converted to numeric values"
or line =: "NOTE: Missing values were generated as a result of performing an operation on missing values"
or line =: "NOTE: MERGE statement has more than one data set with repeats of BY values"
or line =: "NOTE: Invalid (or missing) arguments to the INTNX function have caused the function to return"
or line =: "INFO: Character variables have defaulted to a length of 200"
or line =: "NOTE: Invalid"
)
and not
(
line =: "WARNING: Your system is scheduled to expire"
or line =: "WARNING: The Base Product product with which Session Manager is associated"
or line =: "WARNING: will be expiring soon, and is currently in warning mode to indicate"
or line =: "WARNING: this upcoming expiration. Please run PROC SETINIT to obtain more"
or line =: "WARNING: information on your warning period."
or line =: "WARNING: This CREATE TABLE statement recursively references the target table. A consequence"
or line =: "WARNING: Unable to copy SASUSER registry to WORK registry. Because of this, you will not see registry customizations during this"
or line =: "WARNING: Estimates did not improve after a ridge was encountered in the objective function."
or line =: "WARNING: Estimates may not have converged."
or line =: "ERROR: A lock is not available for"
or line =: "ERROR: Errors printed on pages"
)
then do;
problem = 1;
output problems;
end;
output log;
run;

希望这对您有所帮助。

关于python - 在 Windows 中从 SAS 捕获 stdout 和 stderr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8234999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com