在Python中使用ctypes.CDLL调用c函数时,该函数始终以0作为参数传递
我试图调用的c函数: 包括 包括 int mainnt argc,char*argv[]{ 长整型n=atollargv[1]; printfmain%lld\n,n; int m=0; 当n>1{ m++; 如果n%2==0{//偶数 printf%lld=%lld/2\n,n/2,n; n=n/2; } 否则{ printf%lld=3*%lld+1\n,3*n+1,n; n=3*n+1; } } printfCollatz%lld是“%d”\n,n,m; 返回m; } 我的python代码尝试使用参数4调用它 从ctypes导入* 导入操作系统,系统 打印您键入的内容:,sys.argv[1] filename=sys.argv[1]。拆分。[0] os.systemfgcc-c-fPIC{filename}.c-o{filename}.o&&gcc{filename}.o f-shared-o{filename}.so soFile=CDLLos.getcwd+/+filename+.so soFile.main4TLDR评论线程: 您应该将其拆分为2个func,main和collatz int collatzlong n,并使main只需将atollargv[1]传递给collatz,这样您就可以将其作为可执行文件正常运行,也可以将其作为共享库从python脚本文件中运行。您还需要将ctypes中的argtype设置为long longI,我认为它默认为int C:在Python中使用ctypes.CDLL调用c函数时,该函数始终以0作为参数传递,python,c++,c,ctypes,neovim,Python,C++,C,Ctypes,Neovim,我试图调用的c函数: 包括 包括 int mainnt argc,char*argv[]{ 长整型n=atollargv[1]; printfmain%lld\n,n; int m=0; 当n>1{ m++; 如果n%2==0{//偶数 printf%lld=%lld/2\n,n/2,n; n=n/2; } 否则{ printf%lld=3*%lld+1\n,3*n+1,n; n=3*n+1; } } printfCollatz%lld是“%d”\n,n,m; 返
注意:与此问题没有直接关系,但您应该检查以确保C代码中的argc>2,以避免在未传递任何arg的情况下进行越界读取。除非我记错了什么,否则argv[0]不应该是放入的第一个参数,而不是argv[1]?argv不会传递给main so atollargv[1]不起作用。为什么这主要是放在首位?您正在将其作为共享库加载,不需要main。只需将其更改为int collatzlong long n或类似于sig的内容,它应该是固定的。@supersformer它成为主函数的原因是,这样我也可以选择将c函数编译为可执行文件,并执行例如../collatz循环4,顺便说一下,它工作得非常好!。你认为我可以在不改变c-main函数签名的情况下修复它吗?好的,然后将它分成两个func,main和collatz,让main将atollargv[1]传递给collatz。
:!python test.py "collatz-loop"
you typed: collatz-loop
main(0)
Collatz(0) is '0'
:!python test.py "collatz-loop"
shell returned 139
#include <stdio.h>
#include <stdlib.h>
int collatz(long long n){
int m = 0;
while (n > 1) {
m++;
if (n % 2 == 0) { // even
printf("%lld = %lld/2 \n", n/2, n);
n = n/2;
}
else {
printf("%lld = 3*%lld+1 \n", 3*n+1, n);
n = 3*n + 1;
}
}
printf("Collatz(%lld) is '%d'\n", n,m);
return m;
}
int main(int argc, char *argv[]){
long long int n = atoll(argv[1]);
printf("main(%lld)\n", n);
collatz(n);
}
from ctypes import *
import os, sys
print("you typed:", sys.argv[1])
filename = sys.argv[1].split(".")[0]
os.system(f"gcc -c -fPIC {filename}.c -o {filename}.o && gcc {filename}.o " \
f"-shared -o {filename}.so")
soFile = CDLL(os.getcwd() + "/" + filename + ".so")
soFile.collatz.argtypes = [c_longlong]
soFile.collatz(4)