este posibil să folosiți import după sys.exit (1)?

Am o funcție GetVars() (care nu ar trebui să fie schimbată), aruncă sys.exit (1) în unele cazuri. Vreau să fac o curățare pentru acest caz:

try:
  common_func.GetVars()
except SystemExit:
  cmdline = "-user user1"
  sys.argv = ['config.py', cmdline]
  import config

config.py should take some args, but it contains the only print statement for now. But it is not executed - is there any way to do it? Just trying to understand what happens, I know the code looks odd :)

UPD: acum încerc să fug

cur_dir = os.path.dirname(os.path.realpath(__file__))
gcti_cfgDir = os.path.join(cur_dir, "..", "cfg-scripts")
 sys.path.append(gcti_cfgDir)
import config
try:
  sys.exit(1)
except SystemExit:
  try:
    import config
  except:
    print "errr"
2
adăugat autor Marcin, sursa
probabil încercați să apelați fișierul dvs. config.py folosind os sau subprocesul în loc să îl importați, deoarece ați spus că este nevoie de args?
adăugat autor IT Ninja, sursa
Ne puteți arăta config.py?
adăugat autor robert, sursa

2 răspunsuri

Am încercat cu acest fișier mymodule.py :

$ cat mymodule.py 
import sys

try:
  sys.exit(1)
except SystemExit:
  cmdline = "-user user1"
  sys.argv = ['config.py', cmdline]
  import config

și cu acest fișier config.py :

$ cat config.py 
print "Everything is ok for now"

Rezultatul este cel așteptat:

$ python mymodule.py 
Everything is ok for now

Sunt sigur că problema nu se află în importul per se, nici în capturarea SystemExit ... Probabil că fișierul config.py este întrerupt.

UPDATE: Ah, I believe I got it!

Conform noului cod, importați modulul config înainte de sys.exit (<) și importându-l în blocul cu excepția :

import config # <-- here...
try:
  sys.exit(1)
except SystemExit:
  try:    
    import config # <-- and here
  except:
    print "errr"

Cu toate acestea, codul modulului este executat doar la prima importare . Următoarele au pus modulul în spațiul de nume sau, dacă acesta se află deja în spațiul de nume, nu face nimic.

Cea mai bună soluție, așa cum o văd, este să definiți o funcție în interiorul modulului. Dacă acesta este conținutul modulului dvs.:

print "Everything is ok for now"

doar înlocuiți-l cu

def run():
    print "Everything is ok for now"

În loc de a importa modulul în care doriți să fie executat, importați-l o singură dată și apelați funcția:

import config # This line just imports, does not print nothing
config.run()  # OTOH, this one prints the line...
try:
  sys.exit(1)
except SystemExit:
  try:    
    config.run() # This one prints the line too
  except:
    print "errr"

De fapt, acesta este cu siguranță cel mai bun mod de a face față codului în Python: puneți codul în funcții, puneți funcții în module, apelați funcțiile. În general, nu este o practică bună să plasați codul executabil direct în modul, așa cum ați încercat să faceți.

2nd UPDATE: If you cannot change the code of the config.py module, you can still call it using subprocess.call to call the Python interpreter. You can even pass the parameters you were trying to add to sys.argv:

import subprocess
# ...
subprocess.call(['python', 'config.py'])
try:
  sys.exit(1)
except SystemExit:
  try:
    subprocess.call(['python', 'config.py',  "-user", "user1"])  # Extra args
  except:    
    print "errr"
4
adăugat
@ Francheska oh, cred că am găsit problema. Citiți întrebarea mea actualizată.
adăugat autor brandizzi, sursa
@ Francheska deci, există încă o altă soluție. Vedeți noua mea actualizare.
adăugat autor brandizzi, sursa
config.py contatins doar o linie cu imprimare "hi!"
adăugat autor Francheska, sursa
Am adăugat actualizarea la postarea mea inițială
adăugat autor Francheska, sursa
Mulțumesc!! Din păcate, nu pot modifica acel cod pentru a adăuga funcții, dar acum înțeleg ce se întâmplă
adăugat autor Francheska, sursa

Utilizați modulul atexit pentru a înregistra ordonatorii de curățare sau dacă sunteți sigur că GetVars sună sys.exit , pentru a arunca o excepție personalizată în loc să ruleze cu adevărat, astfel încât să o puteți prinde și să o manipulați manual.

2
adăugat
puteți să prindeți SystemExit; nu este nevoie de o excepție personalizată
adăugat autor jfs, sursa
Buna observatie. Totusi cred ca atexit este cel mai bun mod de a merge.
adăugat autor Noufal Ibrahim, sursa
Python România
Python România
100 participanți

Comunitatea pasionaților de Python din România.