Chciałbym zmienić nazwy funkcji C++ w programie Python. Czy jest coś takiego dostępnego? Szukałem już wiele godzin, może mam szczęście tutaj ...C++ Name Mangling Library for Python
Odpowiedz
Najprawdopodobniej nie chcesz tego robić w Pythonie. Na marginesie prawdopodobnie nie powinno się eksportować zniekształconych nazw z plików DLL, ponieważ sprawia to trudność w użyciu dla każdego z innym kompilatorem.
Jeśli musisz używać zniekształconych nazw, po prostu napisz je w swoim kodzie Pythona. Jeśli masz zamiar zrobić manewrowanie w kodzie Pythona, musisz:
- Znać zasady dotyczące konkretnych implementacji dla danego kompilatora.
- Określ w Pythonie podpis funkcji C++ dla każdej funkcji.
Wydaje mi się wysoce nieprawdopodobne, że kodowanie tego w Pythonie byłoby lepsze, niż po prostu trudne kodowanie zniekształconych nazw.
Dzięki, właśnie dodałem 'extern" C "' i teraz nazwa funkcji wygląda dobrze! – manuels
@manuels Excellent! Eksportowanie zniekształconych nazw z biblioteki DLL lub obiektu współużytkowanego powoduje wiele problemów i zgadzam się, że 'extern" C "' jest rozwiązaniem. –
Jeśli chcesz zminimalizować nazwy, np. do wyświetlenia, możesz utworzyć potok z C++ filt.
def demangle(names):
args = ['c++filt']
args.extend(names)
pipe = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
stdout, _ = pipe.communicate()
demangled = stdout.split("\n")
# Each line ends with a newline, so the final entry of the split output
# will always be ''.
assert len(demangled) == len(names)+1
return demangled[:-1]
print demangle(['_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE17_M_stringbuf_initESt13_Ios_Openmode',
'_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE6setbufEPci'])
Możesz podać argumenty do C++ filt, jeśli potrzebujesz użyć określonej metody demangling.
Mangling nazwy jest znacznie trudniejszy i prawdopodobnie nie da się tego zrobić bez znajomości definicji typów.
Które kompilatory obsługuje C++ filt? –
@David: [Spójrz na dokumenty] (http://sourceware.org/binutils/docs-2.16/binutils/c_002b_002bfilt.html) dla opcji '-s' lub' --format'. –
Przynajmniej z nowszym pythonem musisz użyć stdout.decode() zanim zrobisz split() – mcsim
- 1. Name mangling confusion in LLVM
- 2. Software Synth Library for Java
- 3. Python Exchange ActiveSync Library
- 4. Python Subversion wrapper library
- 5. C++ Library dla XMLRPC
- 6. Python Twitter library: która?
- 7. OpenCL for Python
- 8. Entity Framework for Portable Class Library
- 9. SQL UNION FOR XML name kolumna wyjściowa
- 10. C++ nazwa mangling dekoder dla g ++?
- 11. Python library obraz - pozycjonowanie czcionki
- 12. C# SIP Stack/Library
- 13. C++ FTP Library?
- 14. authorize.net C# wrapper/library
- 15. Nie obsługiwane Python library zacisk kolor/Jupyter
- 16. Python "prywatne" mangling nazwy i instancja vs atrybuty klasy
- 17. Database for Python Twisted
- 18. TGLAugmentedRealityView like library FOR ANDROID? (Lokalizacje na podglądzie kamery)
- 19. Homebrew Python i pisanie do /Library/Python/2.7/site-packages/?
- 20. python http/udp bittorrent tracker scrape library
- 21. Escape string Python for MySQL
- 22. Python equivalent for C++ STL vector/list containers
- 23. Design for C programu
- 24. Wiele liczników w pojedynczej pętli for: Python
- 25. Jak Ping Korzystanie Sockets Library - C
- 26. Problemy z instalacją nimfa (Python Matrix Factorization library)
- 27. ProcessThread Name
- 28. C++ 11 Regex Capture Groups By Name
- 29. Zatrzymaj Eclipse z mangling moje komentarze
- 30. Jak zainstalować bibliotekę Python Imaging Library na Mac OS X?
Łamanie nazw jest zależne od implementacji. Który kompilator Cię interesuje? –
co masz na myśli przez mangle/demangle? –