ja dystrybucji pakiet, który ma taką strukturę:poprawny sposób na znalezienie katalogu skryptów z pliku setup.py w Python distutils?
mymodule:
mymodule/__init__.py
mymodule/code.py
scripts/script1.py
scripts/script2.py
mymodule
podkat od mymodule
zawiera kod, a scripts
podkat zawiera skrypty, które powinny być wykonywalny przez użytkownika.
Opisując instalacji pakietów w setup.py
używam:
scripts=['myscripts/script1.py']
Aby określić, gdzie skrypty powinny iść. Podczas instalacji zwykle znajdują się w katalogu specyficznym dla platformy/użytkownika bin
. Kod, który mam w mymodule/mymodule
, wymaga jednak wywołania skryptów. Jaki jest właściwy sposób, aby znaleźć pełną ścieżkę do tych skryptów? Idealnie powinny one być na ścieżce użytkownika w tym momencie, więc jeśli chcę zadzwonić je z muszli, byłbym w stanie to zrobić:
os.system('script1.py args')
Ale chcę wywołać skrypt o jego bezwzględnej ścieżki, a nie opierać się na platformie określonego katalogu bin jest na PATH
, jak w:
# get the directory where the scripts reside in current installation
scripts_dir = get_scripts_dir()
script1_path = os.path.join(scripts_dir, "script1.py")
os.system("%s args" %(script1_path))
jak można to zrobić? dzięki.
EDYCJA usunięcie kodu poza skryptem nie jest dla mnie rozwiązaniem praktycznym. Powodem jest to, że rozprowadzam zadania do systemu klastrów, a sposób w jaki zwykle to robię jest taki: wyobraź sobie, że masz zestaw zadań, które chcesz wykonywać. Mam skrypt, który przyjmuje wszystkie zadania jako dane wejściowe, a następnie wywołuje inny skrypt, który działa tylko w danym zadaniu. Coś jak:
main.py:
for task in tasks:
cmd = "python script.py %s" %(task)
execute_on_system(cmd)
tak main.py
musi wiedzieć, gdzie script.py
jest, ponieważ musi być wykonywalny polecenie przez execute_on_system
.
pokrewne: [określania lokalizacji danych distutils pliki programowo w Pythonie?] (Http://stackoverflow.com/q/8628495/95735) –
Jak wygląda "execute_on_system()'? –
@PiotrDobrogost: 'execute_on_system' przyjmuje jako wejście ciąg odpowiadający poleceniu powłoki. Następnie tworzy plik tymczasowy o nazwie 'cmd.sh' i wstawia do niego polecenie wraz z niezbędnymi prefiksami określającymi sposób uruchomienia zadania (specyficzne dla systemu klastrowego używanego w systemie użytkownika) - np. Co kolejka do pracy powinien wejść, itd. Następnie wykonuje ten skrypt, 'cmd.sh' i wykonuje go w sposób specyficzny dla systemu, np przez wykonanie: 'os.system (" qsub cmd.sh ")' – user248237dfsf