2013-03-06 19 views
6

Jestem nowy w Scons i Pythonie. Zastanawiam się, czy istnieje sposób wywoływania scons z poziomu skryptu Pythona.Wywoływanie sconów ze skryptu w języku Python

Mój skrypt python akceptuje od użytkownika, listę katalogów, w których znajduje się kod, który ma być skompilowany razem (oprócz wykonywania innych, niebanalnych rzeczy). Generuje również ciąg znaków, który ma być użyty jako nazwa pliku wykonywalnego utworzonego przez scons .

Chcę przekazać te informacje z mojego skryptu Pythona do scons, a następnie wywołać scons. Czy istnieje prosty sposób na zrobienie tego?

mogę myśleć z następujących możliwości:

  • użytku subprocess.call("scons"...) Nie jestem pewien, czy scons akceptuje wszystkie informacje trzeba przekazać jako argumenty wiersza poleceń
  • mają skrypt Pythona pisać do pliku . Poproś SConscripta o przeanalizowanie pliku i pobranie informacji.

Odpowiedz

2

Zrobiłem to za pomocą funkcji Pythona subprocess.call(), aby hermetyzować dość długie i złożone argumenty wiersza poleceń potrzebne dla konkretnego projektu, nad którym pracowałem. Są tacy, którzy twierdzili, że inwokacja powinna być prostsza, aby nie potrzebować jej enkapsulacji, ale to jest inny temat :)

Jedną z opcji do rozważenia, zamiast używać argumentów wiersza poleceń, jest użycie zmiennej środowiskowej SCONSFLAGS jako wymienione here. Osobiście wolę nie używać tej opcji.

Wszystkie potrzebne opcje można przekazać jako opcje wiersza poleceń. Dobrym sposobem dostosowania i obsługi argumentów wiersza poleceń SCons jest funkcja SCons AddOption(). Dodatkowo można uzyskać proste zmienne variable=value za pomocą SCons ARGUMENTS dictionary. Inne powiązane funkcje wiersza poleceń SCons to GetOption() i SetOption().

Jeśli chodzi o przekazywanie ciągu znaków dla nazwy pliku wykonywalnego: SCons może tego nie lubić. Przynajmniej zastanów się, czy wykonasz skrypt raz z określonym ciągiem wykonywalnym, a następnie po raz drugi z innym, a następnie chcesz wyczyścić, możesz zakończyć pozostawiając pliki wykonywalne dookoła, jeśli SCons nie jest wykonywany z tą samą nazwą pliku wykonywalnego.

3

Cóż, myślę, że to możliwe w teorii. Sam plik wykonywalny scons jest po prostu skryptem python, a wszystko co robi to wykonać SCons.Script.main() po modyfikacji zmiennej sys.path. Ale prawdopodobnie będziesz musiał zacząć kopać głęboko w źródle, aby naprawdę zrozumieć, jak sprawić, by robił to, co chcesz.

O wiele czystszym rozwiązaniem jest wywoływanie skryptu z pliku SConscript, który prawdopodobnie jest zamierzonym użytkowaniem i powinno być znacznie łatwiejsze.

+1

Zajrzałem do bezpośredniego wywoływania 'SCons.Script.main()' raz i zdecydowałem, że nie było tego warte. Poszedłem po zawinięcie wywołania w podprocesie.call() 'wywołanie i obsługa argumentów wiersza poleceń, jak wspomniano w mojej odpowiedzi. Myślę, że próba ominięcia rzeczywistego skryptu scons może doprowadzić do świata zranienia :) – Brady

+0

Myślę, że to nie odpowiada na moje pytanie: jak mogę wywołać mój skrypt Pythona z SConscript, w jaki sposób mogę przekazać mu informację, że mam właśnie otrzymałeś _ przedtem_ wywołując scons? –

+0

Czy istnieje realna potrzeba wywołania scenariusza przed scons? Możesz zaimportować swój skrypt jako moduł z pliku SConscript, a następnie wykonać w razie potrzeby, zbierając niezbędne dane wejściowe od użytkownika. Choć technicznie nie to samo, nie ma różnicy w odniesieniu do użytkownika. Jeśli to nie jest opcja, wówczas proponowana przez Brandy droga jest wykonalnym rozwiązaniem. –

1

Dzięki za odpowiedzi. Skończyło się na użyciu tej metody:

Skrypt python zapisuje listę opcji do pliku tekstowego, zamyka go i wywołuje scons -f MySConscript_file przy użyciu wywołania podprocesowego. SConstruct odczytuje wartości z pliku tekstowego na listę i używa ich.

Powiązane problemy