Changeset 1160


Ignore:
Timestamp:
11/29/21 03:25:01 (3 years ago)
Author:
Maciej Komosinski
Message:

Supported python 3.8+ and Windows after breaking change in python 3.8 - new behavior after adding os.add_dll_directory()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • framspy/frams.py

    r1150 r1160  
    321321                lib_path = '.'
    322322
    323         original_dir = os.getcwd()
    324         os.chdir(lib_path)  # because under Windows, frams-objects.dll requires other dll's which reside in the same directory, so we must change current dir for them to be found while loading the main dll.
    325         # TODO in python 3.8+ and Windows, use os.add_dll_directory(lib_path) instead of os.chdir()? And maybe for linux we no longer need chdir() and "./", but use absolute path?
    326         abs_data = os.path.abspath('data')  # use absolute path for -d and -D so python is free to cd anywhere without confusing Framsticks
     323        if os.name == 'nt':
     324                if sys.version_info < (3, 8):
     325                        original_dir = os.getcwd()
     326                        os.chdir(lib_path)  # because under Windows, frams-objects.dll requires other dll's which reside in the same directory, so we must change current dir for them to be found while loading the main dll.
     327                else:
     328                        os.add_dll_directory(lib_path)
     329        abs_data = os.path.join(os.path.abspath(lib_path), "data")  # use absolute path for -d and -D so python is free to cd anywhere without confusing Framsticks
     330
     331
    327332        # for the hypothetical case without lib_path the abs_data must be obtained from somewhere else
    328333        if frams_d is None:
     
    336341        global c_api  # access global variable
    337342        if lib_path is not None and os.name == 'posix':
    338                 lib_name = './' + lib_name  # currently we always have lib_path (even if it is incorrect), but hypothetically it could work with lib_path==None and then load .so from some default system path without './'
     343                lib_name = os.path.join(lib_path, lib_name)  # currently we always have lib_path (even if it is incorrect), but hypothetically it could work with lib_path==None and then load .so from some default system path without './'
    339344        try:
    340345                c_api = ctypes.CDLL(lib_name)  # if accessing this module from multiple threads, they will all share a single c_api and access the same copy of the library and its data. If you want separate independent copies, read the comment at the top of this file on using the "multiprocessing" module.
     
    342347                print("*** Could not find or open '%s' from '%s'.\n*** Did you provide proper arguments and is this file readable?\n" % (lib_name, os.getcwd()))
    343348                raise
    344         os.chdir(original_dir)  # restore current working dir after loading the library so Framsticks sees the expected directory
     349
     350        if os.name == 'nt' and sys.version_info < (3, 8):
     351                os.chdir(original_dir)  # restore current working dir after loading the library so Framsticks sees the expected directory
    345352
    346353        c_api.init.argtypes = [ctypes.c_int, ctypes.POINTER(ctypes.c_char_p)]
Note: See TracChangeset for help on using the changeset viewer.