Hi,
I'm testing the Saspy here, but in order to connect to a dataset from SAS I need to provide a password, since this is a protected dataset.
DATA dataset;
SET database.table (PW='****')
RUN;
How can I provide this password in saspy, is there any method for this?
I don't see a pw= or related options on the sasdata object in SASPy right now, but @sastpw might have some ideas. You can also submit an issue/request at the GitHub project.
Hey! Providing data sets passwords is accomplished through data set options. SASPy provides an attribute on the SASdata object for this; dsopts. Although pw= (read,write,alter=) aren’t listed in the doc as examples, any keyword=value data set option will work in that. In this case, I would suggest using encoded passwords so that they don’t show up in the log. Here’s an example of this. Oh, and with the encoded pw, provide wrapping quotes with it so there’s no syntax error from SAS.
# create a dataset w/ passwords: >>> sas.submitLOG('data a(pw='tom');x=1;run;') 24 data a(pw=XXXXX);x=1;run; NOTE: The data set USER.A has 1 observations and 1 variables. NOTE: DATA statement used (Total process time): real time 0.24 seconds cpu time 0.03 seconds #Assign the SASData object (without the data set options, yet): >>> sd = sas.sasdata('a') >>> sd Libref = USER Table = a Dsopts = {} Results = Pandas # See that this will fail when trying to access the data. >>> sd.contents('text') /opt/tom/github/saspy/saspy/sasiostdio.py:1045: UserWarning: Noticed 'ERROR:' in LOG, you ought to take a look and see if there was a problem warnings.warn("Noticed 'ERROR:' in LOG, you ought to take a look and see if there was a problem") # see error in log after (I removed some of the output to make it more readable) >>> print(sas.lastlog()) 50 proc contents data=USER.'a'n ;run; ERROR: Invalid or missing READ password on member USER.A.DATA. NOTE: Statements not processed because of errors noted above. NOTE: The SAS System stopped processing this step because of errors. NOTE: PROCEDURE CONTENTS used (Total process time): real time 0.04 seconds cpu time 0.00 seconds # Now, add the data set option to the SASData object and see it will work >>> sd.dsopts = {'read':'tom'} >>> sd Libref = USER Table = a Dsopts = {'read': 'tom'} Results = Pandas >>> sd.contents('text') The SAS System 09:10 Monday, October 31, 2022 1 The CONTENTS Procedure Data Set Name USER.A Observations 1 Member Type DATA Variables 1 Engine V9 Indexes 0 Created 10/31/2022 09:11:25 Observation Length 8 Last Modified 10/31/2022 09:11:25 Deleted Observations 0 Protection READ/WRITE/ALTER Compressed NO Data Set Type Sorted NO Label Data Representation SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64 Encoding latin1 Western (ISO) Engine/Host Dependent Information Data Set Page Size 65536 Number of Data Set Pages 1 First Data Page 1 Max Obs per Page 8061 Obs in First Data Page 1 Number of Data Set Repairs 0 Filename /opt/tom/github/saspy/saspy/user/a.sas7bdat Release Created 9.0401M8 Host Created Linux Inode Number 327178180 Access Permission rw-r--r-- Owner Name sastpw File Size 128KB File Size (bytes) 131072 Alphabetic List of Variables and Attributes # Variable Type Len 1 x Num 8 # But, get the encrypted version of your password and use that instead >>> sas.submitLOG("proc pwencode in='tom';run;") 72 proc pwencode in=XXXXX;run; {SAS002}A984D9082E51049E NOTE: PROCEDURE PWENCODE used (Total process time): real time 0.03 seconds cpu time 0.00 seconds # replace the pw (you can specify pw=/read=/write=/alter=, as you need, each as it’s own option too) # Note the embedded pair of quotes so that the value provided to SAS will be quoted, as it requires. >>> sd.dsopts = {'read':"'{SAS002}A984D9082E51049E'"} >>> sd.contents('text') The SAS System 09:10 Monday, October 31, 2022 2 The CONTENTS Procedure Data Set Name USER.A Observations 1 Member Type DATA Variables 1 Engine V9 Indexes 0 Created 10/31/2022 09:11:25 Observation Length 8 Last Modified 10/31/2022 09:11:25 Deleted Observations 0 Protection READ/WRITE/ALTER Compressed NO Data Set Type Sorted NO Label Data Representation SOLARIS_X86_64, LINUX_X86_64, ALPHA_TRU64, LINUX_IA64 Encoding latin1 Western (ISO) Engine/Host Dependent Information Data Set Page Size 65536 Number of Data Set Pages 1 First Data Page 1 Max Obs per Page 8061 Obs in First Data Page 1 Number of Data Set Repairs 0 Filename /opt/tom/github/saspy/saspy/user/a.sas7bdat Release Created 9.0401M8 Host Created Linux Inode Number 327178180 Access Permission rw-r--r-- Owner Name sastpw File Size 128KB File Size (bytes) 131072 Alphabetic List of Variables and Attributes # Variable Type Len 1 x Num 8 >>> print(sas.lastlog()) 296 proc contents data=USER.'a'n (read='{SAS002}A984D9082E51049E' );run; NOTE: The PROCEDURE CONTENTS printed page 2. NOTE: PROCEDURE CONTENTS used (Total process time): real time 0.03 seconds cpu time 0.02 seconds
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.