2017-07-28 1 views
0

je le fichier aller suivant:AttributeError: dlsym (0x7fc4cfd563b0, add_all_items_to_map): symbole non trouvé; en cours d'exécution Go de Python en utilisant C

//try_async.go 
package main 

import (
    "C" 
    "fmt" 
    "math/rand" 
    "sync" 
    "time" 
) 

var mutex sync.Mutex 
var wg sync.WaitGroup 

func random_sleep() { 
    r := rand.Intn(3000) 
    time.Sleep(time.Duration(r) * time.Millisecond) 
} 


func add_to_map(m map[string] string, word string) { 
    defer wg.Done() 
    added_word := word + " plus more letters" 
    fmt.Println("Before sleep") 
    random_sleep() 
    mutex.Lock() 
    defer mutex.Unlock() 
    m[word] = added_word 
    fmt.Println("Added word %v", word) 
} 

// export add_all_items_to_map 
func add_all_items_to_map(words []string) map[string]string { 
    words_map := make(map[string]string) 
    for _, this_word := range words { 
     wg.Add(1) 
     go add_to_map(words_map, this_word) 
    } 
    wg.Wait() 
    return words_map 
} 


func main() { 
    // result := add_all_items_to_map([]string{"cat", "dog", "fish"}) 
    // fmt.Println(result) 
} 

Je le script Python:

from ctypes import cdll 

""" 
run 

    go build -buildmode=c-shared -o try_async.so try_async.go 

first 
""" 

lib = cdll.LoadLibrary('./try_async.so') 

print("Loaded go lib") 
result = lib.add_all_items_to_map(['cat', 'dog', 'fish']) 
print(result) 

Le résultat est étrange erreur que d'autres ont dit est quand vous ne construisez pas l'objet partagé, mais je l'ai fait:

cchilders:~/work_projects/golang_integration (feature/golang-query) 
$ rm *.so 

cchilders:~/work_projects/golang_integration (feature/golang-query) 
$ go build -buildmode=c-shared -o try_async.so try_async.go 

cchilders:~/work_projects/golang_integration (feature/golang-query) 
$ python go-async-caller.py 
Loaded go lib 
Traceback (most recent call last): 
    File "go-async-caller.py", line 14, in <module> 
    result = lib.add_all_items_to_map(['cat', 'dog', 'fish']) 
    File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 375, in __getattr__ 
    func = self.__getitem__(name) 
    File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 380, in __getitem__ 
    func = self._FuncPtr((name_or_ordinal, self)) 
AttributeError: dlsym(0x7fc4cfd563b0, add_all_items_to_map): symbol not found 

Ce qui suit fonctionne le:

libadd.go-

//libadd.go 
package main 

import "C" 

//export add 
func add(left int, right int) int { 
    return left + right 
} 

func main() {} 

go-Caller-example.py-

from ctypes import cdll 

""" 
run 

    go build -buildmode=c-shared -o libadd.so libadd.go 

first 
""" 

lib = cdll.LoadLibrary('./libadd.so') 

print("Loaded go lib") 
result = lib.add(2, 3) 
print(result) 

comme ce

cchilders:~/work_projects/golang_integration (feature/golang-query) 
$ go build -buildmode=c-shared -o libadd.so libadd.go 

cchilders:~/work_projects/golang_integration (feature/golang-query) 
$ python go-caller-example.py 
Loaded go lib 
5 

http://savorywatt.com/2015/09/18/calling-go-code-from-python-code/

+1

Vous avez une faute de frappe dans votre directive '// export', il ne peut y avoir d'espace avant' export'. – JimB

Répondre

1

directives dans Go sont un peu fragile, vous besoin de les avoir exactement raison ou ils échoueront silencieusement.

Dans ce cas, vous avez ceci:

// export add_all_items_to_map 

Mais ce besoin:

//export add_all_items_to_map 

Voir the cgo docs pour plus d'informations.

+0

oh l'homme est-ce brutal. Merci – codyc4321