Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 准备基于C的Cython包以在pypi上发布_Python_Cython_Pypi - Fatal编程技术网

Python 准备基于C的Cython包以在pypi上发布

Python 准备基于C的Cython包以在pypi上发布,python,cython,pypi,Python,Cython,Pypi,我将创建C库,并希望使用Cython创建Python包装器 现在我已经编译并绑定了mylib.a文件(C文件),我想用Cython包装我库中的方法 我成功地创建了.pyx和.pxd文件,我可以使用python setup.py build\u ext命令来构建它。当我尝试在pypi上发布它时,我的问题出现了。如果我运行我的setup.py,创建轮子并发布它,我可以从pypi下载它-但我不能运行import mylib 我在网上读了很多这方面的教程。很少有人表示他们的C代码是在用户端编译的。我的代

我将创建C库,并希望使用Cython创建Python包装器

现在我已经编译并绑定了
mylib.a
文件(C文件),我想用Cython包装我库中的方法

我成功地创建了
.pyx
.pxd
文件,我可以使用
python setup.py build\u ext
命令来构建它。当我尝试在pypi上发布它时,我的问题出现了。如果我运行我的
setup.py
,创建轮子并发布它,我可以从pypi下载它-但我不能运行
import mylib

我在网上读了很多这方面的教程。很少有人表示他们的C代码是在用户端编译的。我的代码库将由许多文件构建,我更愿意将已经构建的C代码作为
.a
文件提供

我的文件结构(仅重要文件):

我的
\uuuu init\uuuuu.py
文件(导入从pip下载的包后,它在此处抛出错误):

My
setup.py
(我认为只有重要参数):

(我在
python setup.py build\u ext
之前使用
mylib.pyx
中的cython构建
mylib.bycode.c
。根据文章,这将加快安装包的速度,并且不需要用户使用相同的cython版本。)

也许值得一提的是,在构建了我的包之后,我得到了mylib的
。所以
文件。如果我将其复制到
/mylib
目录,那么我可以从父目录
导入mylib
,并使用
mylib.mylib.say_hello()
访问我的方法。但是,它在从pip安装的软件包(在其他PC上)上不起作用,我也不想使用
mylib.mylib

如果我应该提供更多的信息-让我知道

编辑:

我在GitHub上的项目(我之前混淆了名称,所以这里是真正的项目):

我想从
statr.pyx
成功运行
say_hello()
方法(其他方法可能不起作用)


我知道代码有一些问题,但我想首先有一个工作核心来修复和更新一切。要生成项目,请使用
build\u script.sh
upload\u script.sh
创建并发布控制盘。

setup.py
中有几个问题

  • setup.py
    未编译链接到库。这意味着它必须手动编译
  • 链接到库是预编译的静态链接存档。这是不可移植的,除了用于构建它的GCC/glibc的确切版本之外,不能分发到任何其他地方
  • cython扩展代码不是由
    setup.py
    生成的。对.pyx/.pxd的更改不会反映在包中
尝试以下方法:

from setuptools import setup, find_packages, Extension
from Cython.Build import cythonize, build_ext

extensions = [Extension(
          name="statr._ext", 
          sources=["statr/_ext.pyx", "lib/mylib.c"],
          depends="lib/mylib.h",
          include_dirs=[numpy.get_include(), "lib/"]
]

setup(name='statr'
      packages=find_packages(),
      ext_modules=cythonize(extensions),
      build_ext: build_ext
      }
)
根据上述内容,扩展名将为
statr.\u ext
。pyx的名称应为
\u ext.pyx

mylib.c
将通过
setup.py
构建并链接到扩展。
mylib.c
所需的任何其他编译器指令都应添加到扩展中

包名称将是
statr
。例如,您应该从
\u ext
导入任何您希望从其
\uuuu init\uuuuuuuuuuuuuuuupy
模块的顶层
statrd
中可用的内容

from ._ext import my_cython_function

如何从PyPI安装?(下载+
python setup.py安装
pip安装
)。当时有错误消息吗?导入mylib时出现任何错误(如果是,具体是什么错误)?对于Cython软件包,您可以提供pyx/pxd文件或c文件,就像您所做的那样。两者都应该起作用。有关更多信息,请。@Pierredebyl感谢您的关注。我尝试了
pip安装
。我遇到了一些常见的错误-指向
\uuu init\uuuuu.py
的第一行,说
无法安装名称“mylib”
。在这一点上,我的整个项目可以作为最小的例子。我添加了有关github的链接。
setup(name='mylib'
      packages=['mylib'],
      ext_modules = [Extension(
          name="mylib", 
          sources=["mylib/mylib.bycython.c"], 
          include_dirs = [numpy.get_include(), "lib/"],
          extra_objects=["lib/mylib.a"])],
        "build_ext": build_ext
      }
)
from setuptools import setup, find_packages, Extension
from Cython.Build import cythonize, build_ext

extensions = [Extension(
          name="statr._ext", 
          sources=["statr/_ext.pyx", "lib/mylib.c"],
          depends="lib/mylib.h",
          include_dirs=[numpy.get_include(), "lib/"]
]

setup(name='statr'
      packages=find_packages(),
      ext_modules=cythonize(extensions),
      build_ext: build_ext
      }
)
from ._ext import my_cython_function