sassoftware / saspy

A Python interface module to the SAS System. It works with Linux, Windows, and Mainframe SAS as well as with SAS in Viya.
https://sassoftware.github.io/saspy
Other
367 stars 149 forks source link

No Log4j configuration file found? #453

Closed thefaultinourcode closed 2 years ago

thefaultinourcode commented 2 years ago

Hello! I'm trying to get saspy up and running on my windows machine (I have SAS installed locally) and I've been running into some errors. I ended up modifying the host file, adding new environment variables, etc., but I'm stuck on this one error:

image

I'm not sure where the Log4j config file is supposed to be located for saspy or what it needs to contain. What should I do to resolve this error?

tomweber-sas commented 2 years ago

Hey, well, there's no need for a log4j config file, as it's not used; saspy doesn't use log4j in the java client for IOM. The only reason you are seeing that is because you're running that command from the terminal. And that makes me think you did so because you got an error trying to connect, and the message said to try this? So, what was the actual message from SASsession(), that I'm assuming failed, thus running the command like this? Again with a guess?

The OS Error was:
The system cannot find the file specified

SAS Connection failed. No connection established. Double check your settings in sascfg_personal.py file.

If that's it then it's 'java' that's not being found; you may need to put the full path to java.exe in your java key in your config instead of just 'java;.

But enough w/ the guessing, what error are you getting and what's your configurations?

Thanks, Tom

thefaultinourcode commented 2 years ago

So when I try to run sas = saspy.SASsession(cfgname='winlocal') in Jupyter notebook I get this error:

The OS Error was:
The system cannot find the file specified
SAS Connection failed. No connection established. Double check your settings in sascfg_personal.py file.
Attempted to run program java with the following parameters:['java', '-classpath', 'C:\\Users\\lerams\\.conda\\envs\\RSSData\\lib\\site-packages\\saspy\\java\\saspyiom.jar;C:\\Users\\lerams\\.conda\\envs\\RSSData\\lib\\site-packages\\saspy\\java\\iomclient\\log4j-1.2-api-2.12.4.jar;C:\\Users\\lerams\\.conda\\envs\\RSSData\\lib\\site-packages\\saspy\\java\\iomclient\\log4j-api-2.12.4.jar;C:\\Users\\lerams\\.conda\\envs\\RSSData\\lib\\site-packages\\saspy\\java\\iomclient\\log4j-core-2.12.4.jar;C:\\Users\\lerams\\.conda\\envs\\RSSData\\lib\\site-packages\\saspy\\java\\iomclient\\sas.security.sspi.jar;C:\\Users\\lerams\\.conda\\envs\\RSSData\\lib\\site-packages\\saspy\\java\\iomclient\\sas.core.jar;C:\\Users\\lerams\\.conda\\envs\\RSSData\\lib\\site-packages\\saspy\\java\\iomclient\\sas.svc.connection.jar;C:\\Users\\lerams\\.conda\\envs\\RSSData\\lib\\site-packages\\saspy\\java\\iomclient\\sas.rutil.jar;C:\\Users\\lerams\\.conda\\envs\\RSSData\\lib\\site-packages\\saspy\\java\\iomclient\\sas.rutil.nls.jar;C:\\Users\\lerams\\.conda\\envs\\RSSData\\lib\\site-packages\\saspy\\java\\iomclient\\sastpj.rutil.jar;C:\\Users\\lerams\\.conda\\envs\\RSSData\\lib\\site-packages\\saspy\\java\\thirdparty\\glassfish-corba-internal-api.jar;C:\\Users\\lerams\\.conda\\envs\\RSSData\\lib\\site-packages\\saspy\\java\\thirdparty\\glassfish-corba-omgapi.jar;C:\\Users\\lerams\\.conda\\envs\\RSSData\\lib\\site-packages\\saspy\\java\\thirdparty\\glassfish-corba-orb.jar;C:\\Users\\lerams\\.conda\\envs\\RSSData\\lib\\site-packages\\saspy\\java\\thirdparty\\pfl-basic.jar;C:\\Users\\lerams\\.conda\\envs\\RSSData\\lib\\site-packages\\saspy\\java\\thirdparty\\pfl-tf.jar', 'pyiom.saspy2j', '-host', 'localhost', '-stdinport', '51090', '-stdoutport', '51091', '-stderrport', '51092', '-zero', '-lrecl', '1048576', '']
If no OS Error above, try running the following command (where saspy is running) manually to see what is wrong:
java -classpath "C:\Users\lerams\.conda\envs\RSSData\lib\site-packages\saspy\java\saspyiom.jar;C:\Users\lerams\.conda\envs\RSSData\lib\site-packages\saspy\java\iomclient\log4j-1.2-api-2.12.4.jar;C:\Users\lerams\.conda\envs\RSSData\lib\site-packages\saspy\java\iomclient\log4j-api-2.12.4.jar;C:\Users\lerams\.conda\envs\RSSData\lib\site-packages\saspy\java\iomclient\log4j-core-2.12.4.jar;C:\Users\lerams\.conda\envs\RSSData\lib\site-packages\saspy\java\iomclient\sas.security.sspi.jar;C:\Users\lerams\.conda\envs\RSSData\lib\site-packages\saspy\java\iomclient\sas.core.jar;C:\Users\lerams\.conda\envs\RSSData\lib\site-packages\saspy\java\iomclient\sas.svc.connection.jar;C:\Users\lerams\.conda\envs\RSSData\lib\site-packages\saspy\java\iomclient\sas.rutil.jar;C:\Users\lerams\.conda\envs\RSSData\lib\site-packages\saspy\java\iomclient\sas.rutil.nls.jar;C:\Users\lerams\.conda\envs\RSSData\lib\site-packages\saspy\java\iomclient\sastpj.rutil.jar;C:\Users\lerams\.conda\envs\RSSData\lib\site-packages\saspy\java\thirdparty\glassfish-corba-internal-api.jar;C:\Users\lerams\.conda\envs\RSSData\lib\site-packages\saspy\java\thirdparty\glassfish-corba-omgapi.jar;C:\Users\lerams\.conda\envs\RSSData\lib\site-packages\saspy\java\thirdparty\glassfish-corba-orb.jar;C:\Users\lerams\.conda\envs\RSSData\lib\site-packages\saspy\java\thirdparty\pfl-basic.jar;C:\Users\lerams\.conda\envs\RSSData\lib\site-packages\saspy\java\thirdparty\pfl-tf.jar" pyiom.saspy2j -host localhost -stdinport 51090 -stdoutport 51091 -stderrport 51092 -zero -lrecl 1048576  

No SAS process attached. SAS process has terminated unexpectedly.
Invalid response from SAS on inital submission. printing the SASLOG as diagnostic

---------------------------------------------------------------------------
SASIOConnectionError                      Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_4280/2495431843.py in <module>
----> 1 sas = saspy.SASsession(cfgname='winlocal')

~\.conda\envs\RSSData\lib\site-packages\saspy\sasbase.py in __init__(self, **kwargs)
    597 
    598            if failed:
--> 599               raise SASIOConnectionError(res)
    600 
    601            if self.pyenc is not None:

SASIOConnectionError: Failure establishing SASsession.
 No SAS process attached. SAS process has terminated unexpectedly.

I tried adding the path to java.exe to my config file, but I think the error was still the same when I tried to rerun that code. Here's what I have:

#
# Copyright SAS Institute
#
#  Licensed under the Apache License, Version 2.0 (the License);
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.
#

# THIS IS AN EXAMPLE CONFIG FILE. PLEASE CREATE YOUR OWN sascfg_personal.py FILE USING THE APPROPRIATE TEMPLATES FROM BELOW
# SEE THE CONFIGURATION DOC AT https://sassoftware.github.io/saspy/install.html#configuration

# Configuration Names for SAS - python List
# This is the list of allowed configuration definitions that can be used. The definition are defined below.
# if there is more than one name in the list, and cfgname= is not specified in SASsession(), then the user
# will be prompted to choose which configuration to use.
#
# The various options for the different access methods can be specified on the SASsession() i.e.:
# sas = SASsession(cfgname='default', options='-fullstimer', user='me')
#
# Based upon the lock_down configuration option below, you may or may not be able to override option
# that are defined already. Any necessary option (like user, pw for IOM or HTTP) that are not defined will be 
# prompted for at run time. To dissallow overrides of as OPTION, when you don't have a value, simply
# specify options=''. This way it's specified so it can't be overridden, even though you don't have any
# specific value you want applied.
# 
#SAS_config_names = ['default', 'ssh', 'iomlinux', 'iomwin', 'winlocal', 'winiomlinux', 'winiomwin', 'httpsviya', 'httpviya', 'iomcom']
#

SAS_config_names=['winlocal']

# Configuration options for saspy - python Dict   # not required unless changing any of the defaults
# valid key are:
# 
# 'lock_down' - True | False. True = Prevent runtime overrides of SAS_Config values below
#
# 'verbose'   - True | False. True = Allow print statements for debug type messages
#
# 'prompt'    - True | False. True = Allow prompting as necessary
#
SAS_config_options = {'lock_down': False,
                      'verbose'  : True,
                      'prompt'   : True
                     }

# Configuration options for SAS output. By default output is HTML 5.0 (using "ods html5" statement) but certain templates might not work 
# properly with HTML 5.0 so it can also be set to HTML 4.0 instead (using "ods html" statement). This option will only work when using IOM
# in local mode. Note that HTML 4.0 will generate images separately which clutters the workspace and if you download the notebook as HTML, 
# the HTML file will need to be put in the same folder as the images for them to appear.
# valid key are:
# 
# 'output' = ['html5', 'html']
#
SAS_output_options = {'output' : 'html5'}       # not required unless changing any of the default

# Configuration Definitions
#
# For STDIO and STDIO over SSH access methods
# These need path to SASHome and optional startup options - python Dict
# The default path to the sas start up script is: /opt/sasinside/SASHome/SASFoundation/9.4/sas
# A usual install path is: /opt/sasinside/SASHome
#
# The encoding is figured out by saspy. You don't need to specify it, unless you just want to get rid of the message about which encoding was determined.
#                                                                                                         
# valid keys are:
# 'saspath'  - [REQUIRED] path to SAS startup script i.e.: /opt/sasinside/SASHome/SASFoundation/9.4/sas
# 'options'  - SAS options to include in the start up command line - Python List
# 'encoding' - This is the python encoding value that matches the SAS session encoding your SAS session is using 
#
# For passwordless ssh connection, the following are also reuqired:
# 'ssh'     - [REQUIRED] the ssh command to run
# 'host'    - [REQUIRED] the host to connect to
#
# Additional valid keys for ssh:
# 'port'    - [integer] the remote ssh port
# 'tunnel'  - [integer] local port to open via reverse tunnel, if remote host cannot otherwise reach this client
#
default  = {'saspath'  : '/opt/sasinside/SASHome/SASFoundation/9.4/bin/sas_u8'
            }

ssh      = {'saspath' : '/opt/sasinside/SASHome/SASFoundation/9.4/bin/sas_en',
            'ssh'     : '/usr/bin/ssh',
            'host'    : 'remote.linux.host', 
            'encoding': 'latin1',
            'options' : ["-fullstimer"]
            }

# For IOM (Grid Manager or any IOM) and Local Windows via IOM access method
# These configuration definitions are for connecting over IOM. This is designed to be used to connect to any Workspace server, including SAS Grid, via Grid Manager
# and also to connect to a local Windows SAS session. The client side (python and java) for this access method can be either Linux or Windows.
# The STDIO access method above is only for Linux. PC SAS requires this IOM interface.
#
# The absence of the iomhost option triggers local Windows SAS mode. In this case none of 'iomhost', 'iomport', 'omruser', 'omrpw' are needed.
# a local SAS session is started up and connected to.
#
# The encoding is figured out by saspy. You don't need to specify it, unless you just want to get rid of the message about which encoding was determined.

# NONE OF THE PATHS IN THESE EAMPLES ARE RIGHT FOR YOUT INSTALL. YOU HAVE TO CHANGE THE PATHS TO BE CORRECT FOR YOUR INSTALLATION 
#
# valid keys are:
# 'java'      - [REQUIRED] the path to the java executable to use
# 'iomhost'   - [REQUIRED for remote IOM case, Don't specify to use a local Windows Session] the resolvable host name, or ip to the IOM server to connect to
# 'iomport'   - [REQUIRED for remote IOM case, Don't specify to use a local Windows Session] the port IOM is listening on
# 'authkey'   - identifier for user/password credentials to read from .authinfo file. Eliminates prompting for credentials.
# 'omruser'   - not suggested        [REQUIRED for remote IOM case but PROMPTED for at runtime] Don't specify to use a local Windows Session
# 'omrpw'     - really not suggested [REQUIRED for remote IOM case but PROMPTED for at runtime] Don't specify to use a local Windows Session
# 'encoding'  - This is the python encoding value that matches the SAS session encoding of the IOM server you are connecting to
# 'appserver' - name of physical workspace server (when more than one app server defined in OMR) i.e.: 'SASApp - Workspace Server'
# 'sspi'      - boolean. use IWA instead of user/pw to connect to the IOM workspace server

iomlinux = {'java'      : '/usr/bin/java',
            'iomhost'   : 'linux.iom.host',
            'iomport'   : 8591,
            }           

iomwin   = {'java'      : '/usr/bin/java',
            'iomhost'   : 'windows.iom.host',
            'iomport'   : 8591,
            }

winlocal = {'java'      : 'C:\Program Files (x86)\Common Files\Oracle\Java\javapath\java.exe',
            'encoding'  : 'windows-1252',
            }

winiomlinux = {'java'   : 'java',
            'iomhost'   : 'linux.iom.host',
            'iomport'   : 8591,
            }

winiomwin  = {'java'    : 'java',
            'iomhost'   : 'windows.iom.host',
            'iomport'   : 8591,
            }

winiomIWA  = {'java'    : 'java',
            'iomhost'   : 'windows.iom.host',
            'iomport'   : 8591,
            'sspi'      : True
            }

# For Remote and Local IOM access methods using COM interface
# These configuration definitions are for connecting over IOM using COM. This
# access method is for Windows clients connecting to remote hosts. Local
# SAS instances may also be supported.
#
# This access method does not require a Java dependency.
#
# Valid Keys:
#   iomhost     - Required for remote connections only. The Resolvable SAS
#                 server dns name.
#   iomport     - Required for remote connections only. The SAS workspace
#                 server port. Generally 8591 on standard remote
#                 installations. For local connections, 0 is the default.
#   class_id    - Required for remote connections only. The IOM workspace
#                 server class identifier. Use `PROC IOMOPERATE` to identify
#                 the correct value. This option is ignored on local connections.
#   provider    - [REQUIRED] IOM provider. "sas.iomprovider" is recommended.
#   encoding    - This is the python encoding value that matches the SAS
#                 session encoding of the IOM server.
#   omruser     - SAS user. This option is ignored on local connections.
#   omrpw       - SAS password. This option is ignored on local connections.
#   authkey     - Identifier for credentials to read from .authinfo file.

iomcom = {
    'iomhost' : 'mynode.mycompany.org',
    'iomport' : 8591,
    'class_id': '440196d4-90f0-11d0-9f41-00a024bb830c',
    'provider': 'sas.iomprovider',
    'encoding': 'windows-1252'}

# HTTP access method to connect to the Compute Service
# These need ip addr, other values will be prompted for - python Dict
# valid keys are:
# 'url'     - (Required if ip not specified) The URL to Viya, of the form "http[s]://host.idenifier[:port]". 
#             When this is specified, ip= will not be used, as the host's ip is retrieved from the url. Also, ssl= is 
#             set based upon http or https and port= is also parsed from the url, if provided, else defaulted based 
#             upon the derived ssl= value. So neither ip, port nor ssl are needed when url= is used.
# 'ip'      - (Required if url not specified) The resolvable host name, or IP address to the Viya Compute Service
# 'port'    - port; the code Defaults this to based upon the 'ssl' key; 443 default else 80
# 'ssl'     - whether to use HTTPS or just HTTP protocal. Default is True, using ssl and poort 443
# 'context' - context name defined on the compute service  [PROMTED for at runtime if more than one defined]
# 'authkey' - identifier for user/password credentials to read from .authinfo file. Eliminates prompting for credentials.
# 'options' - SAS options to include (no '-' (dashes), just option names and values)
# 'user'    - not suggested [REQUIRED but PROMTED for at runtime]
# 'pw'      - really not suggested [REQUIRED but PROMTED for at runtime]
# 
#

httpsviya = {'ip'      : 'sastpw.rndk8s.openstack.sas.com',
             'context' : 'Data Mining compute context',
             'authkey' : 'viya_user-pw',
             'options' : ["fullstimer", "memsize=1G"]
             }

httpviya = {'ip'      : 'sastpw.rndk8s.openstack.sas.com',
            'ssl'     : False,  # this will use port 80
            'context' : 'Data Mining compute context',
            'authkey' : 'viya_user-pw',
            'options' : ["fullstimer", "memsize=1G"]
            }
tomweber-sas commented 2 years ago

Ah, yep. So, with the full path, you have to either use double backslashes, cuz it's windows, or use python's r'string' syntax so it doesn't think the'\' in the string are escape sequences. That would be why it was the same error probably, because the path wasn't right when it changed some of the charaters.

winlocal = {'java'      : r'C:\Program Files (x86)\Common Files\Oracle\Java\javapath\java.exe',
            'encoding'  : 'windows-1252',
            }

or winlocal = {'java'      : 'C:\\Program Files (x86)\\Common Files\\Oracle\\Java\\javapath\\java.exe',
            'encoding'  : 'windows-1252',
            }

See if that solves it.

tomweber-sas commented 2 years ago

Though, I don't think any of those letters are escape chars after the slash. So, that might not actually be a problem. What it the error when you use the full path? Is that actually the right path?

thefaultinourcode commented 2 years ago

It looks like adding in the double slashes fixed the issue! Thanks so much for your help!

image

tomweber-sas commented 2 years ago

Well cool! Yes, this should be the easy case, as far as configuration goes. So good deal. Let me know if you need anything else! You can close this if you're good to go

Thanks! Tom