从Python调用PARI/GP

fel*_*ipa 4 python linux pari-gp

我想从Python 调用PARI/GP来计算我定义的nextprime(n)不同ns 的函数.不幸的是我无法安装pari-python所以我想我只是os.system在Python中使用命令行来调用它.但是,我在手册页中看不到如何让PARI/GP以非交互模式运行.有没有办法实现这个目标?

sen*_*rle 5

您可以像这样将输入输入到gp的stdin中,使用该-q标志来消除冗长:

senderle:~ $ echo "print(isprime(5))" | gp -q
1
Run Code Online (Sandbox Code Playgroud)

但是,创建一个简单的python扩展并不困难,它允许您将字符串传递给pari的内部解析器并返回结果(作为字符串).这是我前段时间写的一个简单的版本,所以我可以从python 调用pari的APRT测试实现.您可以进一步扩展它以进行适当的转换,依此类推.

//pariparse.c

#include<Python.h>
#include<pari/pari.h>

static PyObject * pariparse_run(PyObject *self, PyObject *args) {
    pari_init(40000000, 2);
    const char *pari_code;
    char *outstr;

    if (!PyArg_ParseTuple(args, "s", &pari_code)) { return NULL; }
    outstr = GENtostr(gp_read_str(pari_code));
    pari_close();
    return Py_BuildValue("s", outstr);
}

static PyMethodDef PariparseMethods[] = {
    {"run", pariparse_run, METH_VARARGS, "Run a pari command."},
    {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC initpariparse(void) {
    (void) Py_InitModule("pariparse", PariparseMethods);
}
Run Code Online (Sandbox Code Playgroud)

和设置文件:

#setup.py

from distutils.core import setup, Extension

module1 = Extension('pariparse',
                    include_dirs = ['/usr/include', '/usr/local/include'],
                    libraries = ['pari'],
                    library_dirs = ['/usr/lib', '/usr/local/lib'],
                    sources = ['pariparse.c'])

setup (name = 'pariparse',
       version = '0.01a',
       description = 'A super tiny python-pari interface',
       ext_modules = [module1])
Run Code Online (Sandbox Code Playgroud)

然后输入python setup.py build以构建扩展.然后你可以像这样调用它:

>>> pariparse.run('nextprime(5280)')
'5281'
Run Code Online (Sandbox Code Playgroud)

我刚刚测试了它,它为我编译了最新版本的pari,可通过自制程序(在OS X上)获得.因人而异!