2013-01-14 15 views
13

Podczas korzystania setuptools/distutils do budowy bibliotek C w Pythoniebiblioteki Testowanie Python C - dostać zbudować ścieżkę

$ python setup.py build 

się *.so/*.pyd pliki są umieszczane w build/lib.win32-2.7 (lub równoważny).

Chciałbym przetestować te pliki w moim pakiecie testowym, ale wolę nie twardo kodować ścieżkę build/lib*. Czy ktoś wie, jak wyciągnąć tę ścieżkę z distutils, więc mogę sys.path.append(build_path) - czy istnieje jeszcze lepszy sposób, aby uzyskać te pliki? (bez zainstalowania ich najpierw)

+1

Też tego chciałem, ale nigdy nie byłem wystarczająco zmotywowany, aby szukać odpowiedzi ... – mgilson

Odpowiedz

11

Musisz uzyskać platformę, na której pracujesz i wersję pythona, z której korzystasz, a następnie złożyć nazwę samodzielnie. Aby uzyskać bieżącą platformę, użyj sysconfig.get_platform(). Aby uzyskać wersję Pythona, należy użyć sys.version_info (w szczególności pierwszych trzech elementów zwróconej krotki). W moim systemie (64-bit Linux z Python 2.7.2) uzyskać:

>>> import sysconfig 
>>> import sys 
>>> sysconfig.get_platform() 
linux-x86_64 
>>> sys.version_info[:3] 
(2, 7, 2) 

Format katalogu lib "lib.platform-versionmajor.versionminor" (czyli tylko 2,7, a nie 2.7.2) . Można skonstruować ten ciąg przy użyciu metody formatowania ciąg Pythona:

def distutils_dir_name(dname): 
    """Returns the name of a distutils build directory""" 
    f = "{dirname}.{platform}-{version[0]}.{version[1]}" 
    return f.format(dirname=dname, 
        platform=sysconfig.get_platform(), 
        version=sys.version_info) 

Można to wykorzystać do generowania nazwy któregokolwiek z distutils zbudować katalog:

>>> import os 
>>> os.path.join('build', distutils_dir_name('lib')) 
build/lib.linux-x86_64-2.7 
+1

Dokładnie to miałem nadzieję nie musieć robić - ale dziękuję za odpowiedź. Być może któregoś dnia zdążę napisać ten niesamowity pakiet dystrybucyjny Pythona samemu ... – danodonovan

+1

@danodonovan Byłem podobnie rozczarowany, gdy chciałem tych informacji i stwierdziłem, że muszę napisać powyższą funkcję. Wygląda na to, że powinno być łatwo dostępne za pośrednictwem distutils. Przynajmniej w ten sposób można programowo obliczyć ścieżkę i nie trzeba go zakodować na sztywno. – SethMMorton

+0

W krótszej formie: python -c 'import sys, sysconfig; print ("build/lib. {} - {}. {}" .format (sysconfig.get_platform(), * sys.version_info [: 2])) ' – zbyszek

4

znalazłem, że kompilacja modułu na miejscu jest najlepiej do celów testowych. Aby to zrobić wystarczy użyć

python setup.py build_ext --inplace 

To skompiluje wszystkie pliki pomocnicze w katalogu temp, jak zwykle, ale ostateczny plik .so zostaną wprowadzone w bieżącym katalogu.

4

Jest to dostępne jako build_lib z klasy poleceń build i jest zależne od tego, gdzie byłby setup.py. Pierwsze w tym, kiedy nie jesteś w rzeczywistości działa setup jest dość paskudny:

import distutils.dist 
import distutils.command.build 
b = distutils.command.build.build(distutils.dist.Distribution()) 
b.finalize_options() 
print(b.build_lib) 

Osobiście poszedłbym roztworem SethMMorton za, ponieważ mimo to potencjalnie kruche jeśli distutils zmienia lokalizację katalogu build, podejrzewam, grając te rodzaje sztuczki są jeszcze bardziej kruche, jeśli zmienia się struktura.

+1

Słowo ostrzeżenia: 'distutils.dist.Distribution()' nie będzie wystarczające, jeśli na przykład twoja konfiguracja.py' buduje natywne rozszerzenie. W takim przypadku może być konieczne utworzenie 'Distribution' z pliku metadanych' setup.py'. – zneak

Powiązane problemy