Linux (Ubuntu Gnome 16, Anaconda python 3.5) Ошибка сборки Cython (несколько определений)

#python #linux #ubuntu #anaconda #cython

#python #linux #ubuntu #anaconda #cython

Вопрос:

Я перешел на Linux с win10. Все должно быть просто и т.д. Для работы с библиотеками и сборки на Linux … но этот простой код не создается. Я знаю, как использовать команды cython для сборки (из его руководства) и it worker на python с msvc = 2008, 2013, 2015. Но этот проклятый Linux почему-то здесь не так хорош; / и не будет собираться

HelloWorld.pyx

 #cython: language_level=2
print "hello world!"
  

Или (та же ошибка)

HelloWorld.pyx

 #cython: language_level=3
print("hello world!")
  

Я создаю его с помощью (это $ {fileDirname} из задачи visual code):

 zsh -c ". activate py35a amp;amp; gcc --version amp;amp; python ${fileDirname}/setup.py build_ext --inplace"
  

setup.py

 from __init__ import *

try:
    from setuptools import setup
    from setuptools import Extension
except ImportError:
    from distutils.core import setup
    from distutils.extension import Extension

from Cython.Distutils import build_ext
from Cython.Compiler.Options import directive_defaults
from Cython.Build import cythonize

import numpy


import os,sys

from sys import platform

path=current_path()
os.chdir(path)

print("CWD: %s"%path)


#this is one of my old functions (like from being a NOOB), it was making error, now I changed it (so it do not add second file with .cpp extension)...
def sources(*lst):
    lst=list(lst)
    for n in range(len(lst)):
        lst[n] ='.pyx'
    return lst


ext_modules=[
    Extension("C_helloWorld",
              sources=sources("helloWorld"),
    ),
]

for extension in ext_modules:
    extension.include_dirs=[numpy.get_include()]
    extension.language='c  '
    #extension.extra_compile_args=['-g']
    #extension.extra_link_args=['-g', '-pthread']
setup(
        name = 'simple test of cython',
        cmdclass = {'build_ext': build_ext},
        ext_modules = ext_modules,

)
  

Это ошибка, которую я получаю:

 gcc (GCC) 4.8.5
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
No module named 'adjustText'
CWD: /home/robgrzel/SHARED/GOOGLE/WORKSPACE/PROJECTS/SHIPPING/CTO/A2_CROSS_SECTIONS/
Compiling helloWorld.pyx because it changed.
[1/1] Cythonizing helloWorld.pyx
running build_ext
building 'C_helloWorld' extension
gcc -pthread -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/robgrzel/ProgramFiles/Programming/Python/Miniconda3/envs/py35a/lib/python3.5/site-packages/numpy/core/include -I/home/robgrzel/ProgramFiles/Programming/Python/Miniconda3/envs/py35a/include/python3.5m -c helloWorld.cpp -o build/temp.linux-x86_64-3.5/helloWorld.o
cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C   [enabled by default]
gcc -pthread -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/robgrzel/ProgramFiles/Programming/Python/Miniconda3/envs/py35a/lib/python3.5/site-packages/numpy/core/include -I/home/robgrzel/ProgramFiles/Programming/Python/Miniconda3/envs/py35a/include/python3.5m -c helloWorld.cpp -o build/temp.linux-x86_64-3.5/helloWorld.o
cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C   [enabled by default]
g   -pthread -shared -L/home/robgrzel/ProgramFiles/Programming/Python/Miniconda3/envs/py35a/lib -Wl,-rpath=/home/robgrzel/ProgramFiles/Programming/Python/Miniconda3/envs/py35a/lib,--no-as-needed build/temp.linux-x86_64-3.5/helloWorld.o build/temp.linux-x86_64-3.5/helloWorld.o -L/home/robgrzel/ProgramFiles/Programming/Python/Miniconda3/envs/py35a/lib -lpython3.5m -o /home/robgrzel/SHARED/GOOGLE/WORKSPACE/PROJECTS/SHIPPING/CTO/A2_CROSS_SECTIONS/C_helloWorld.cpython-35m-x86_64-linux-gnu.so -pthread
build/temp.linux-x86_64-3.5/helloWorld.o: In function `PyInit_helloWorld':
/home/robgrzel/SHARED/GOOGLE/WORKSPACE/PROJECTS/SHIPPING/CTO/A2_CROSS_SECTIONS/helloWorld.cpp:698: multiple definition of `PyInit_helloWorld'
build/temp.linux-x86_64-3.5/helloWorld.o:/home/robgrzel/SHARED/GOOGLE/WORKSPACE/PROJECTS/SHIPPING/CTO/A2_CROSS_SECTIONS/helloWorld.cpp:698: first defined here
build/temp.linux-x86_64-3.5/helloWorld.o: In function `PyInit_helloWorld':
/home/robgrzel/SHARED/GOOGLE/WORKSPACE/PROJECTS/SHIPPING/CTO/A2_CROSS_SECTIONS/helloWorld.cpp:698: multiple definition of `__pyx_module_is_main_CTO__A2_CROSS_SECTIONS__helloWorld'
build/temp.linux-x86_64-3.5/helloWorld.o:/home/robgrzel/SHARED/GOOGLE/WORKSPACE/PROJECTS/SHIPPING/CTO/A2_CROSS_SECTIONS/helloWorld.cpp:698: first defined here
collect2: error: ld returned 1 exit status
error: command 'g  ' failed with exit status 1
  

Решаемая путем изменения источников функций (похоже, что это была полностью моя ошибка, не связанная с Linux и cython, позор мне; /)

Теперь это дает:

 gcc (GCC) 4.8.5
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
3.5.2 |Anaconda custom (64-bit)| (default, Jul  2 2016, 17:53:06) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]
No module named 'adjustText'
CWD: /home/robgrzel/SHARED/GOOGLE/WORKSPACE/PROJECTS/SHIPPING/CTO/A2_CROSS_SECTIONS/
Compiling hello_world.pyx because it changed.
[1/1] Cythonizing hello_world.pyx
running build_ext
building 'c_hello_world' extension
gcc -pthread -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/robgrzel/ProgramFiles/Programming/Python/Miniconda3/envs/py35a/lib/python3.5/site-packages/numpy/core/include -I/home/robgrzel/ProgramFiles/Programming/Python/Miniconda3/envs/py35a/include/python3.5m -c hello_world.c -o build/temp.linux-x86_64-3.5/hello_world.o
gcc -pthread -shared -L/home/robgrzel/ProgramFiles/Programming/Python/Miniconda3/envs/py35a/lib -Wl,-rpath=/home/robgrzel/ProgramFiles/Programming/Python/Miniconda3/envs/py35a/lib,--no-as-needed build/temp.linux-x86_64-3.5/hello_world.o -L/home/robgrzel/ProgramFiles/Programming/Python/Miniconda3/envs/py35a/lib -lpython3.5m -o /home/robgrzel/SHARED/GOOGLE/WORKSPACE/PROJECTS/SHIPPING/CTO/A2_CROSS_SECTIONS/c_hello_world.cpython-35m-x86_64-linux-gnu.so -pthread
  

Tada… Но это неправильное название расширения: c_hello_world.cpython-35m-x86_64-linux-gnu.so

Комментарии:

1. Что это sources("helloWorld") ? Этот бит выглядит необычно для меня, и я нигде не вижу определения sources . Если вы посмотрите на строку ссылки, она отображается build/temp.linux-x86_64-3.5/helloWorld.o дважды, вероятно, поэтому вы получаете несколько определений. Но я не знаю, почему это происходит дважды.

2. Я тоже это замечаю, но почему это происходит? А «источники» — это kwarg для расширения? Если вы добавите «HelloWorld.pyx» в исходники и… Черт возьми, вот это было. Это какая-то старая функция годичной давности… Это единственный способ описать то, с чем я столкнулся сейчас .. s2.quickmeme.com/img/26 /…