Odczytanie argumentów uruchomieniowych

Odczytanie argumentów uruchomieniowych
R1
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:18
0

Witam

Napisałem skrypt , który pobiera z niego programu (postprocesora) dane

Kopiuj
import sys
if len(sys.argv) >1:

    E_Value = float(sys.argv[1])

code = 'G1 E ' + str(E_Value)

nie bardzo rozumiem jak działa sys.argv? Służy do pobierania danych. Dla sys.argv[1] działa tzn. pobiera daną, Ale nie wiem jak przypisać inną daną w programie głównym , żeby odczytać ja : sys.argv[2]?

Po prostu chcę skorzystać z dwóch zmiennych. W głównym programie nam zmienną self.PRINT_E_NEW i self.PRINT_V_NEW i chcę je wyprowadzić do skryptu.

Dziękuję i pozdrawiam !!

edytowany 1x, ostatnio: Riddle
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 dni
1

sys.argv to tablica przekazanych parametrów wśród których sys.argv[0] to ścieżka i nazwa programu.
Więc jak len(sys.argv) >1 to znaczy że oprócz ścieżki i nazwy programu jest jeszcze jeden parametr.
sys.argv[1] - to właśnie ten jeden parametr.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: Riddle
R1
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:18
0

i ten parametr przekazuje główny program do skrypt. Teraz chcę przekazać z głównego programu jeszcze jedną zmienną do skryptu I jak ją przypisać w programie ?
W skrypcie odczytam sys.argv[2 ] - tylko jak zapisać w do tego w głównym programie ?

edytowany 1x, ostatnio: robo1973
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 dni
1

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
R1
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:18
0

Przeczytałem Nadal nie wiem jak wpisać wartość do parametru sys.argv[2 ] ??
Jak odczytać jest w moim pierwszym poście Tylko nie mogę zapisać tam danej żeby ją przekazać

Kopiuj
if len(sys.argv) > 2:
                    
                    sys.argv = str(self.SPEED_MS)

ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
0

@robo1973:

A dlaczego chcesz PRZYPISAĆ ?
Być może to jakoś-tam-jest-możliwe (nie jest zablokowane), ale to tradycyjna dana tylko do odczytu.

Tłuczesz głową w ścianę z gorliwością typową dla XY Problem

robo1973 napisał(a):

Napisałem skrypt , który pobiera z niego programu (postprocesora) dane

Jesli wydaje ci się, że to czytelne zdanie, to masz rację. Wydaje ci się.

Po prostu chcę skorzystać z dwóch zmiennych. W głównym programie nam zmienną self.PRINT_E_NEW i self.PRINT_V_NEW i chcę je wyprowadzić do skryptu.

Pokaż jak go wywołujesz


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
edytowany 1x, ostatnio: ZrobieDobrze
R1
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:18
0

W programie głównym jeżeli jest wywołanie Extruder
to chcę wysłać zmienną SPEED_MS do sys.argv[2] Nie wiem gdzie wpisywana jest zmienna self.PRINT_E_NEW do argv[1] ponieważ ją odczytuję bez problemu

Kopiuj
 if code.startswith("Extruder("):

                # Intercept the extruder command.
                # if the program call is Extruder(123.56)
                # we extract the number as a string
                # and convert it to a number

                self.PRINT_E_NEW = float(code[9:-1])
                
                #sys.argv = str(self.PRINT_E_NEW)
                # wywałanie funkcji extruder.py
                self.addline("Extruder")
                
                #sys.argv = str(self.SPEED_MS)  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<????????????????????????????
                    
                #self.addline('Extruder_by Robo %s' % self.PRINT_E_NEW)
                #self.addline('Extruder_by Robo %s' % sys.argv)
                # Skip the program call generation
                return
            else:
                self.addline(code + "()")

Zmienne sys.argv[1] i sys.argv[2] odczytuję skryptami poniżej tylko na argv[2] nic nie trafia

Kopiuj
import sys
if len(sys.argv) > 1:

    E_Value = float(sys.argv[1])

i

Kopiuj
import sys
if len(sys.argv) > 2:
   e_value = float(sys.argv[2])

if f_value is None :
	f_value = 0
edytowany 3x, ostatnio: Riddle
ZD
Czy słowa "jak wywołujesz" są jakoś szczególnie trudne ?
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10076
0

sys.argv to są argumenty uruchomieniowe, jeden z poziomów przekazywania danych do uruchamianych procesów. Kiedy startujesz proces, może mu przekazać między innymi takie dane:

  • Listę argumentów uruchomieniowych
  • Dane na wejście standardowe (również znane jako "standard input", albo "stdin")
  • Przechwycić zwracane dane ze standard output oraz standard error (również znane jako "stdout" i "stderr")
  • Zmienne środowiskowe

W różnych językach inaczej odczytuje się argumenty uruchomieniowe, w javie to będzie np public static void main(String[] argv), podobnie w C#, w PHP będzie to $argv, a w pythonie mamy sys.argv.

Jeśli chcesz sprawdzić jak działają, to napisz sobie taki plik test_args.py z treścią:

Kopiuj
import sys

for arg in sys.argv:
  print("Kolejny argument to: ")
  print(arg)

I uruchom go w taki sposób

Kopiuj
python test_args.py to jest "mój test"

Zobaczysz coś takiego:

Kopiuj
C:\Users\Riddle> python test_args.py to jest "mój test"
Kolejny argument to: 
test.py              
Kolejny argument to: 
to                   
Kolejny argument to: 
jest
Kolejny argument to: 
mój test
C:\Users\Riddle> 

W większości systemów operacyjnych nazwa pliku jest przekazywana jako pierwszy argument argumentów uruchomieniowych.

robo1973 napisał(a):

Po prostu chcę skorzystać z dwóch zmiennych. W głównym programie nam zmienną self.PRINT_E_NEW i self.PRINT_V_NEW i chcę je wyprowadzić do skryptu.

Nie odbierzesz żadnych danych, których Twój program nie przekazał. Możesz zrobić print(sys.argv) żeby zobaczyć wszystkie przekazane argumenty.

Innymi słowy - nie w odczytywanie sys.argv jest Twój problem, tylko w miejscu w którym spawnujesz swój proces. Musisz pokazać więcej kodu tego który uruchamia Twój skrypt.

edytowany 5x, ostatnio: Riddle
ZD
Prawdziwi hakerzy nie czytają - sądzisz że kolega przeczyta aż tak długi post ?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.