Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    error when including an external library

    PYTHON Development
    0
    4
    1.1k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H
      Helper
      last edited by

      On 10/06/2018 at 05:29, xxxxxxxx wrote:

      Hi,

      I have problems using an external lib within python. The path where the required DLL is located is added to the PATH variable and afterwards the PyDLL call is run:

      Lets say I create a dummy external package "foo" in the C4D root dir (R19) :

      <c4d root dir>\resource\modules\python\Python.win64.framework\Lib\site-packages\foo

      Then I create a subdir named "DLLs" and copy the required foo.dll to it:

      <c4d root dir>\resource\modules\python\Python.win64.framework\Lib\site-packages\foo\DLLs\foo.dll

      Now I create ...

      <c4d root dir>\resource\modules\python\Python.win64.framework\Lib\site-packages\foo\__init__.py

      and enter this code:

        
      import os  
      import ctypes  
        
      try:  
        dll_name = "foo.dll"  
        dll_path = os.path.abspath(__file__ + "/../DLLs")  
        original_path = os.environ['PATH']  
        os.environ['PATH'] = "%s;%s" % (dll_path, original_path)  
        rt = ctypes.PyDLL(dll_name)  
      except (ImportError, WindowsError) :  
        raise  
      

      This method of adding the dllpath to the PATH environment variable works like a charm without errors when running this code in a command box:

        
      cd <c4d root dir>\resource\modules\python\Python.win64.framework
      python.exe
      \>>> import foo
      

      But inside C4D (using a python tag or inside a plugin) it's not working:

      WindowsError: [Error 126] Das angegebene Modul wurde nicht gefunden
      

      I've also tried to specify a absolute path in the ctypes.PyDLL() call. Same result: it works in a windows command box but not inside C4D 😠

      Any help is appreciated.
      Thanks,

      Jens

      1 Reply Last reply Reply Quote 0
      • H
        Helper
        last edited by

        On 10/06/2018 at 14:36, xxxxxxxx wrote:

        To be a little more specific: __"Rtree" is a ctypes Python wrapper that uses the library "spatialindex". Finding and loading the spatialindex dll is the problem.

          
        cd <c4d root dir>\resource\modules\python\Python.win64.framework
          
        scripts\pip install https://download.lfd.uci.edu/pythonlibs/g1ylh5la/Rtree-0.8.3-cp27-cp27m-win_amd64.whl
        

        package "rtree" now gets installed in Python.win64.framework\lib\site-packages\rtree
        Here is also the needed dll located: "spatialindex_c.dll"

        Using rtree and loading the dll is no problem when using a command box:

        cd <c4d root dir>\resource\modules\python\Python.win64.framework
        python.exe
        \>>> from rtree import index
        

        no error

        BUT ... inside C4D it doesn't work:

        Start C4D
        create null object
        create python tag
        insert "from rtree import index"
        run code and see script console:

          
        File "<c4d root dir>\Python.win64.framework\lib\site-packages\rtree\core.py", line 116, in <module>  
          raise OSError("could not find or load spatialindex_c.dll")  
        OSError: could not find or load spatialindex_c.dll
        

        Where is the difference between running C4D's python.exe in a command box and using python inside C4D when loading any DLL ?

        Thanks,
        Jens

        1 Reply Last reply Reply Quote 0
        • H
          Helper
          last edited by

          On 12/06/2018 at 09:20, xxxxxxxx wrote:

          Hi Jens,

          unfortunately we can not really provide support for installation and usage of 3rd party modules.

          I think, you will have to build Rtree specifically for the use in Cinema 4D. Currently the best help I can provide is a link to our community member Niklas Rosenstein's page: Building NumPy for Cinema 4D on Windows

          Another thing may be, the Python documentation (FAQ) says, 3rd party modules need to be installed here: {USER_FOLDER}/library/python/packages/{osx/win32/win64}

          The delivered python.exe is a pure Python console with no access to Cinema 4D (i.e. you can't import module c4d). It's not related to the python environment inside Cinema 4D.

          1 Reply Last reply Reply Quote 0
          • H
            Helper
            last edited by

            On 19/06/2018 at 07:34, xxxxxxxx wrote:

            Hi Andreas,

            thanks for clarifying this. I already built Rtree especially for the current R19 python version ("MSC v. 1700]) following Niklas' hints on his help pages. And for all other extensions that I built this works perfectly in the past. Meanwhile it seems to me that there is something wrong with the way Rtree tries to find and bind the spatialindex dll. This Rtree wrapper is apparently not coded "rocksolid" so it may work in a python console but not in an embedded python environment.

            Thanks again for your help and best regards,
            Jens

            1 Reply Last reply Reply Quote 0
            • First post
              Last post