在不使用setup.py的情况下从cpp文件安装numpy扩展

时间:2017-09-09 15:58:18

标签: python c++ python-3.x numpy anaconda

我在尝试安装python库时遇到问题(https://pypi.python.org/pypi?name=py_find_1st&:action=display);

我之前发过一篇关于它的帖子,但我没有得到解决问题的答案(AttributeError: 'MSVCCompiler' object has no attribute 'compiler' when trying to install a numpy extension),所以我想知道是否可以使用不同的方法来安装它

当我运行setup.py文件时,收到一条错误消息AttributeError: 'MSVCCompiler' object has no attribute 'compiler'

我的计算机上安装了visual studio,安装了构建工具,cl被识别为命令。

我不太了解numpy扩展,但我想知道是否有安装库而不运行setup.py,因为它不能在我的计算机上运行,​​而且我有一个cpp文件在扩展文件夹中。

我真的很感激任何帮助,我发布了整个错误消息和setup.py代码:

编辑:我发现可以使用pip安装安装,我在cmd中收到相同的错误消息,其中一个红色的附加,我在帖子的底部添加了它

错误讯息:

D:\Chrome dl\py_find_1st-1.0.6\py_find_1st-1.0.6>python setup.py install
running install
running bdist_egg
running egg_info
writing top-level names to py_find_1st.egg-info\top_level.txt
writing py_find_1st.egg-info\PKG-INFO
writing dependency_links to py_find_1st.egg-info\dependency_links.txt
reading manifest file 'py_find_1st.egg-info\SOURCES.txt'
writing manifest file 'py_find_1st.egg-info\SOURCES.txt'
installing library code to build\bdist.win-amd64\egg
running install_lib
running build_py
running build_ext
Traceback (most recent call last):
  File "setup.py", line 117, in <module>
    zip_safe = False,
  File "D:\Anaconda\lib\distutils\core.py", line 148, in setup
    dist.run_commands()
  File "D:\Anaconda\lib\distutils\dist.py", line 955, in run_commands
    self.run_command(cmd)
  File "D:\Anaconda\lib\distutils\dist.py", line 974, in run_command
    cmd_obj.run()
  File "D:\Anaconda\lib\site-packages\setuptools-3.5.1-py3.5.egg\setuptools\command\install.py", line 65, in run
  File "D:\Anaconda\lib\site-packages\setuptools-3.5.1-py3.5.egg\setuptools\command\install.py", line 107, in do_egg_install
  File "D:\Anaconda\lib\distutils\cmd.py", line 313, in run_command
    self.distribution.run_command(command)
  File "D:\Anaconda\lib\distutils\dist.py", line 974, in run_command
    cmd_obj.run()
  File "D:\Anaconda\lib\site-packages\setuptools-3.5.1-py3.5.egg\setuptools\command\bdist_egg.py", line 157, in run
  File "D:\Anaconda\lib\site-packages\setuptools-3.5.1-py3.5.egg\setuptools\command\bdist_egg.py", line 143, in call_command
  File "D:\Anaconda\lib\distutils\cmd.py", line 313, in run_command
    self.distribution.run_command(command)
  File "D:\Anaconda\lib\distutils\dist.py", line 974, in run_command
    cmd_obj.run()
  File "D:\Anaconda\lib\site-packages\setuptools-3.5.1-py3.5.egg\setuptools\command\install_lib.py", line 8, in run
  File "D:\Anaconda\lib\distutils\command\install_lib.py", line 107, in build
    self.run_command('build_ext')
  File "D:\Anaconda\lib\distutils\cmd.py", line 313, in run_command
    self.distribution.run_command(command)
  File "D:\Anaconda\lib\distutils\dist.py", line 974, in run_command
    cmd_obj.run()
  File "D:\Anaconda\lib\distutils\command\build_ext.py", line 338, in run
    self.build_extensions()
  File "setup.py", line 42, in build_extensions
    if compiler_is_clang(self.compiler.compiler):
AttributeError: 'MSVCCompiler' object has no attribute 'compiler'

Setup.py内容:

#! /usr/bin/env python
from __future__ import print_function
from ez_setup import use_setuptools
use_setuptools()

from setuptools import setup
from distutils.extension import Extension
from distutils.command.build_ext import build_ext
from distutils.command.sdist import sdist 

import numpy as np
import os
import sys
import re
import subprocess
import errno

def compiler_is_clang(comp) :
    print("check for clang compiler ...", end=' ')
    try:
        cc_output = subprocess.check_output(comp+['--version'],
                                            stderr = subprocess.STDOUT, shell=False)
    except OSError as ex:
        print("compiler test call failed with error {0:d} msg: {1}".format(ex.errno, ex.strerror))
        print("no")
        return False

    ret = re.search(b'clang', cc_output) is not None
    if ret :
        print("yes")
    else:
        print("no")
    return ret


class build_ext_subclass( build_ext ):
    def build_extensions(self):
        #c = self.compiler.compiler_type
        #print "compiler attr", self.compiler.__dict__
        #print "compiler", self.compiler.compiler
        #print "compiler is",c
        if compiler_is_clang(self.compiler.compiler):
            for e in self.extensions:
                e.extra_compile_args.append('-stdlib=libstdc++')
                e.extra_compile_args.append('-Wno-unused-function')
            for e in self.extensions:
                e.extra_link_args.append('-stdlib=libstdc++')
        build_ext.build_extensions(self)



find_1st_ext = Extension("find_1st", ["utils_find_1st/find_1st.cpp"],
                          include_dirs=[np.get_include()],
                           language="c++"   )


ext_modules=[find_1st_ext]


# get _pysndfile version number
for line in open("utils_find_1st/__init__.py") :
    if "version" in line:
        version = re.split('[()]', line)[1].replace(',','.')
        break

# Utility function to read the README file.
# Used for the long_description.  It's nice, because now 1) we have a top level
# README file and 2) it's easier to type in the README file than to put a raw
# string in below ...
def update_long_descr():
    README_path     = os.path.join(os.path.dirname(__file__), 'README.md')
    LONG_DESCR_path = os.path.join(os.path.dirname(__file__), 'LONG_DESCR')
    if ((not os.path.exists(LONG_DESCR_path))
                          or os.path.getmtime(README_path) > os.path.getmtime(LONG_DESCR_path)):
        try :
            subprocess.check_call(["pandoc", "-f", "markdown", '-t', 'rst', '-o', LONG_DESCR_path, README_path], shell=False)
        except (OSError, subprocess.CalledProcessError) :
            print("setup.py::error:: pandoc command failed. Cannot update LONG_DESCR.txt from modified README.txt")
    return open(LONG_DESCR_path).read()

def read_long_descr():
    LONG_DESCR_path = os.path.join(os.path.dirname(__file__), 'LONG_DESCR')
    return open(LONG_DESCR_path).read()

class sdist_subclass(sdist) :
    def run(self):
        # Make sure the compiled Cython files in the distribution are up-to-date
        update_long_descr()
        sdist.run(self)


setup( name = "py_find_1st",
       version = version,
       packages = ['utils_find_1st'],
       ext_package = 'utils_find_1st',
       ext_modules = ext_modules,
       author = "A. Roebel",
       description = "Numpy extension module for efficient search of first array index that compares true",
       cmdclass = {'build_ext': build_ext_subclass, "sdist": sdist_subclass },
       author_email = "axel.dot.roebel@ircam.dot.fr",
        long_description = read_long_descr(),
        license = "GPL",
        url = "http://github.com/roebel/py_find_1st",
        download_url = "https://github.com/roebel/py_find_1st/archive/v{0}.tar.gz".format(version),
        keywords = "numpy,extension,find",
        classifiers = [
            "Topic :: Software Development :: Libraries :: Python Modules",
            "Programming Language :: Python :: 3",
            "Development Status :: 5 - Production/Stable",
            "License :: OSI Approved :: GNU General Public License (GPL)",
            "Operating System :: MacOS :: MacOS X",
            "Operating System :: POSIX :: Linux",
            "Operating System :: Microsoft :: Windows",
        ],

       # don't install as zip file because those cannot be analyzed by pyinstaller
       zip_safe = False,
    )
尝试使用pip安装扩展程序时,

cmd中出现红色错误消息:

Command "D:\Anaconda\python.exe -u -c "import setuptools, tokenize;__file__='C:\\Users\\erlin\\AppData\\Local\\Temp\\pip-build-1k70u6ig\\py-find-1st\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record C:\Users\erlin\AppData\Local\Temp\pip-szd7d6ya-record\install-record.txt --single-version-externally-managed --compile" failed with error code 1 in C:\Users\erlin\AppData\Local\Temp\pip-build-1k70u6ig\py-find-1st\

0 个答案:

没有答案