我正在尝试使用C扩展文件构建共享库,但首先我必须使用以下命令生成输出文件:
gcc -Wall utilsmodule.c -o Utilc
执行命令后,我得到以下错误消息:
utilsmodule.c:1:20:致命错误:Python.h:没有此类文件或目录编译终止。
我已经尝试了所有建议的解决方案,但是仍然存在该问题。我没有问题Python.h
。我设法在机器上找到该文件。
我正在尝试使用C扩展文件构建共享库,但首先我必须使用以下命令生成输出文件:
gcc -Wall utilsmodule.c -o Utilc
执行命令后,我得到以下错误消息:
utilsmodule.c:1:20:致命错误:Python.h:没有此类文件或目录编译终止。
我已经尝试了所有建议的解决方案,但是仍然存在该问题。我没有问题Python.h
。我设法在机器上找到该文件。
Answers:
看来您尚未正确安装python dev的标头文件和静态库。使用软件包管理器在系统范围内安装它们。
对于apt
(Ubuntu,Debian ...):
sudo apt-get install python-dev # for python2.x installs
sudo apt-get install python3-dev # for python3.x installs
对于yum
(CentOS,RHEL ...):
sudo yum install python-devel # for python2.x installs
sudo yum install python3-devel # for python3.x installs
对于dnf
(Fedora ...):
sudo dnf install python2-devel # for python2.x installs
sudo dnf install python3-devel # for python3.x installs
对于zypper
(openSUSE ...):
sudo zypper in python-devel # for python2.x installs
sudo zypper in python3-devel # for python3.x installs
对于apk
(Alpine ...):
# This is a departure from the normal Alpine naming
# scheme, which uses py2- and py3- prefixes
sudo apk add python2-dev # for python2.x installs
sudo apk add python3-dev # for python3.x installs
对于apt-cyg
(Cygwin ...):
apt-cyg install python-devel # for python2.x installs
apt-cyg install python3-devel # for python3.x installs
sudo yum install python27-devel
apt-get install python3.6-dev
为我工作。
sudo apt-get install python3.6-dev
sudo apt-get install python3.7-dev
。
在Ubuntu上,我正在运行Python 3,必须安装
sudo apt-get install python3-dev
如果要使用未链接到python3的Python版本,请安装关联的python3.x-dev软件包。例如:
sudo apt-get install python3.5-dev
sudo apt-get install python3.4-dev
为Python3.4 运行了命令,这解决了我的问题。
sudo apt-get install python2.7-dev
解决了问题
python3-dev
则会安装该版本的依赖项,该依赖项链接到python3
command。因此,如果要安装特定版本,请使用-的完整版本python3.x-dev
。
sudo apt-get install python3.6-dev
特别是对于Python 3.7和Ubuntu,我需要
sudo apt install libpython3.7-dev
。我认为在某些时候名称已从此更改pythonm.n-dev
。
对于Python 3.6,类似地:
sudo apt install libpython3.6-dev
sudo apt install libpython3.6-dev
您必须做两件事。
为Debian / Ubuntu / Mint安装适用于Python的开发包,可通过以下命令完成:
sudo apt-get install python-dev
第二件事是,默认情况下,包含文件不在包含路径中,Python库也不与可执行文件链接。您需要添加这些标志(相应地替换Python的版本):
-I/usr/include/python2.7 -lpython2.7
换句话说,您的编译命令应为:
gcc -Wall -I/usr/include/python2.7 -lpython2.7 utilsmodule.c -o Utilc
在Fedora上针对Python 2运行它:
sudo dnf install python2-devel
而对于Python 3:
sudo dnf install python3-devel
apt-get install python-dev
。
如果要使用tox在多个版本的Python上运行测试,则可能需要为要测试的每个Python版本安装Python开发库。
sudo apt-get install python2.6-dev
sudo apt-get install python2.7-dev
etc.
您需要安装软件包python2-devel
或python3-devel
,具体取决于您使用的Python版本。
您可以使用Cygwin.com上的32位或64位 setup.exe
(取决于您的安装)快速安装它。
示例(setup.exe
如果需要,可以修改的文件名和Python的主要版本):
$ setup.exe -q --packages=python3-devel
在AWS API(centOS)中
yum install python27-devel
pip install cryptography
在亚马逊Linux实例上尝试遇到的问题。
对我来说,将其更改为有效:
#include <python2.7/Python.h>
我找到了文件/usr/include/python2.7/Python.h
,并且由于/usr/include
已经在include路径中,因此python2.7/Python.h
应该足够了。
您也可以从命令行添加包含路径- gcc -I/usr/lib/python2.7
(感谢@ erm3nda)。
gcc -I/usr/lib/python2.7 etc
而不是硬编码include调用。
就我而言,在Ubuntu中修复该问题的是安装软件包libpython-all-dev
(或者libpython3-all-dev
如果您使用Python 3)。
python-all-dev
就我而言,但足够接近。
情况不一样,但对我也适用,现在我可以在Python3.5中使用SWIG了:
我正在尝试编译:
gcc -fPIC -c existe.c existe_wrap.c -I /usr/include/python3.5m/
使用Python 2.7可以正常工作,而不能用于我的3.5版本:
existe_wrap.c:147:21:致命错误:Python.h:没有存档或目录编译终止。
在我的Ubuntu 16.04安装中运行后:
sudo apt-get install python3-dev # for python3.x installs
现在,我可以毫无问题地编译Python3.5了:
gcc -fPIC -c existe.c existe_wrap.c -I /usr/include/python3.5m/
尝试apt文件。很难记住丢失文件所在的软件包名称。它是通用的,对任何软件包文件都有用。
例如:
root@ubuntu234:~/auto# apt-file search --regexp '/Python.h$'
pypy-dev: /usr/lib/pypy/include/Python.h
python2.7-dbg: /usr/include/python2.7_d/Python.h
python2.7-dev: /usr/include/python2.7/Python.h
python3.2-dbg: /usr/include/python3.2dmu/Python.h
python3.2-dev: /usr/include/python3.2mu/Python.h
root@ubuntu234:~/auto#
现在,您可以对要选择的专家进行猜测。
我设法解决了这个问题,并在一个命令中生成了.so文件
gcc -shared -o UtilcS.so
-fPIC -I/usr/include/python2.7 -lpython2.7 utilsmodule.c
对于CentOS 7:
sudo yum install python36u-devel
我按照此处的说明在多个VM上安装python3.6:https ://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming- 在centos-7上运行 ,然后能够构建mod_wsgi并使其与python3.6 virtualenv一起使用
当我尝试使用Python3.6在CentOS 7上安装ctds时发生此错误。我做了这里提到的所有技巧,包括yum install python34-devel
。在Python.h
中发现了问题/usr/include/python3.4m but not in /usr/include/python3.6m
。我试图--global-option
指向包含dir(pip3.6 install --global-option=build_ext --global-option="--include-dirs=/usr/include/python3.4m" ctds
)的位置。导致在lpython3.6m
链接ctds时找不到。
最后,有效的方法是修复Python3.6的开发环境,需要使用include和libs进行更正。
yum -y install https://dl.iuscommunity.org/pub/ius/stable/CentOS/7/x86_64/python36u-libs-3.6.3-1.ius.centos7.x86_64.rpm
Python.h必须位于gcc的包含路径中。无论使用哪个版本的python(例如,如果版本为3.6,则/usr/include/python3.6m/Python.h
通常都应使用该版本)。
当然,python-dev
还是libpython-all-dev
(apt
)的第一件事install
,但是,如果这对我的情况没有帮助,我建议您通过和安装外部功能接口软件包。sudo apt-get install libffi-dev
sudo pip install cffi
如果您看到错误信息as / from,这应该会有所帮助c/_cffi_backend.c:2:20: fatal error: Python.h: No such file or directory
。
如果操作系统随附的Python不附带Python开发文件,则必须在其上安装Python开发文件。关于这个问题的许多答案显示了在不同系统上可以实现的无数种方法。
当您这样做时,问题是告诉编译器它们的位置以及如何针对它们进行编译。Python附带了一个名为的程序python-config
。对于编译,您需要--includes
输出,并且需要将程序链接到Python库(将Python嵌入程序中)到--ldflags
输出。例:
gcc -c mypythonprogram.c $(python3-config --includes)
gcc -o program mypythonprogram.o $(python3-config --ldflags)
该python-config
程序可以以Python版本命名-例如在Debian,Ubuntu上,它们可以命名为python3-config
或python3.6-config
。
有时即使安装了python-dev之后,错误仍然存在,如果没有'gcc',请检查错误。
首先按照https://stackoverflow.com/a/21530768/8687063中的说明进行下载,然后安装gcc
对于apt(Ubuntu,Debian ...):
sudo apt-get install gcc
对于百胜(CentOS,RHEL ...):
sudo yum install gcc
对于dnf(Fedora ...):
sudo dnf install gcc
对于zypper(openSUSE ...):
sudo zypper in gcc
对于apk(高山...):
sudo apk gcc
locate Python.h
在执行所有这些操作之前,请尝试查看是否已拥有该文件。如果您找到文件所在的位置,则大多数答案将起作用:stackoverflow.com/a/19344978/4954434(这可能只是路径问题)