Calling library functions in python
That return value is available to the caller of the function, but not to any other functions. Question: I have this simple C++ code named which has a function to print «Hello world» I build the .dll (~1.9mb) using: (using gives a when trying to access it in python)
Calling library functions in python
Case I: In some cases, I use the library name to call some set of function i.e, np.median().
Case II: And in some cases, I use the variable name and library name to call another set of function i.e, np.mean(heights) or heights.mean().
In case II, I am able to use both library name and variable name. In case I, only library name works.
My doubt is how to differentiate these tow sets of functions. If I am wrong in anyway, please clear my thoughts. (here i am referring to python language)
In the first case you’re calling a method (function) of the library. Libraries are usually class instances or collections of functions within a module.
In the second example instead, you’re again calling a function from the module but in this case it returns a ndarray (a numpy list basically) which itself has some methods that can be called on it.
Python can’t find module in the same folder, Important is, that your Python interpreter has current directory set properly. – Jan Vlcinsky. Jul 13, 2014 at 11:52. Double check you’re running the files from the expected root directory. only adds the locations for the current python session and not permanently. – Amit Sharma. Apr 12, 2021 at 12:37 Usage examplefrom .hello import hello1Feedback
How to call a previous function in a new function?
How can I refer to a previous function in a new function in python 2.7.
For instance, say if I want to display the result which function1 calculated in function2. How would I go about this?
def func_one(): return 2 + 2 def func_two(): x = func_one() print x func_two() #output: 4
You need to understand the flow of your program. A function doesn’t run until it is called. When it is called, it may return a value (if you say it calculates something, it should return that). That return value is available to the caller of the function, but not to any other functions. So function2 cannot use it. Unless it is passed that value as an argument, that is:
def function1(): return 42 def function2(value): print('The value is %d' % value) x = function1() function2(x)
Function is not defined error in Python, Now let’s see what happens: $ python program.py Traceback (most recent call last): File «program.py», line 3, in
Errno 2 file not found when calling a function from a different .py file
I made a function that reads from a file and saves it’s data in an array.
This function is in Posts.py :
index = 'Forum/Topics/index.txt' def loadTopicNames(): with open(index, 'r') as file: data = file.readlines() for row in data: row = row.replace('\n', '') topicNames.append(row)
This function works, doesn’t have problems with the file location. But when I import the Posts.py module in my Forum.py module, and execute it from Forum.py , I get this error:
with open(index, 'r') as file: FileNotFoundError: [Errno 2] No such file or directory: 'Forum/Topics/index.txt'
Here is the relevant code from Forum.py :
import Posts Posts.loadTopicNames()
Note: I found some solutions on stackoverflow already, but they mostly include making the path absolute, which is not an option here. Posts.py and Forum.py are in the same folder.
This is sort of a representation of where the files are in the project:
Edit: found the problem. The working directory for the Forum.py wasn’t right, and that was the reason it messed everything up. It had wrong working directory because when I first made the module, I made it in a wrong folder. Then when I realized my mistake, I just copied it to the right place, but the working directory stayed the same.
This code will work only if you run python Forum.py in the same directory in which the Forum directory lives.
UPD: I recreated your case on my laptop, and everything works fine. Please check the code:
index = 'Forum/Topics/index.txt' def loadTopicNames(): with open(index, 'r') as file: data = file.readlines() for row in data: print(row)
import Posts Posts.loadTopicNames()
$ ls -R Forum Forum.py Posts.py ./Forum: Topics ./Forum/Topics: index.txt
$ pwd /Users/myuser/Forum $ python Forum.py test text
You should consider to pass the path to the loadtop ic function as a parameter, and passing it on the call in Forum.py
That way you don’t have the absolute path hardcoded on the load module.
Pandas — Calling library functions in python, In the first case you’re calling a method (function) of the library. Libraries are usually class instances or collections of functions within a module. In the second example instead, you’re again calling a function from the module but in this case it returns a ndarray (a numpy list basically) which itself has some …
C++ function in python from .dll using ctypes
I have this simple C++ code named hello.cpp which has a function to print «Hello world»
#include void hello_world(); int main() < std::cout void hello_world()
I build the .dll (~1.9mb) using:
g++ -c hello.cpp g++ -static -fPIC -o hello.dll hello.o
(using -shared gives a WinError 126 . module not found when trying to access it in python)
from ctypes import cdll lib = cdll.LoadLibrary('hello.dll') lib.hello_world()
This throws the following error:
AttributeError: function 'hello_world' not found
I've read people mention that a __declspec(dllexport) wrapper is necessary and so is a extern "C" so that the code doesn't get "mangled". So now using that as the code:
#include extern "C" < __declspec(dllexport) void hello_world(); >int main() < std::cout void hello_world()
The python line lib.hello_world() now raises:
OSError: exception: access violation writing 0x000E28A0
What are the issues here? How can I get python to recognise and run the C++ function in the .dll? Can I skip the middleman and somehow run a C++ function from a . cpp file or a .o file?
Using eryksun's answer, it turns out that the dllexport isn't needed. The extern "C" is a must though
Thanks to @eryksun, this was solved in this case by compiling like this:
g++ -c hello.cpp g++ -static -shared -o hello.dll hello.o
Having the C++ code set up like so:
#include int main() < std::cout void hello_world() < std::cout extern "C"
And running it from Python as usual:
from ctypes import cdll lib = cdll.LoadLibrary('hello.dll') lib.hello_world()
Calling a DLL function from Python, When you specifiy prototype of function you should specify not only the types of arguments, but the return type as first arg to WINFUNCTYPE. Therefore, the line Therefore, the line CATSDllApiProto = ctypes.WINFUNCTYPE (ctypes.c_uint8,ctypes.c_double)