Πώς να συλλάβει Python διερμηνέα ή / και εξόδου CMD.EXE από την Python script;

ψήφοι
7
  1. Είναι δυνατόν να συλλάβει εξόδου Python διερμηνέα από ένα σενάριο Python;
  2. Είναι δυνατόν να συλλάβει έξοδο των Windows CMD από μια δέσμη ενεργειών Python;

Αν ναι, ποια βιβλιοθ (y | ες) θα πρέπει να εξετάσουμε;

Δημοσιεύθηκε 24/08/2008 στις 07:46
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
0

Σε ποιο πλαίσιο ρωτάς;

Προσπαθείτε να συλλάβει την έξοδο από ένα πρόγραμμα που αρχίζει από την γραμμή εντολών;

αν ναι, τότε αυτό είναι το πώς να το εκτελέσει:

somescript.py | your-capture-program-here

και να διαβάσετε την έξοδο, μόλις διαβάσει από το standard input.

Εάν, από την άλλη πλευρά, είστε εκτέλεση του εν λόγω σεναρίου ή cmd.exe ή παρόμοια μέσα από το πρόγραμμά σας, και θέλετε να περιμένετε μέχρι το σενάριο / πρόγραμμα έχει ολοκληρωθεί, και να συλλάβει το σύνολο της παραγωγής της, τότε θα πρέπει να εξετάσουμε την βιβλιοθήκη σας καλεί να χρησιμοποιήσετε για να ξεκινήσει η εξωτερική πρόγραμμα, πιθανότατα υπάρχει ένας τρόπος για να ζητήσετε να σας δώσει κάποιο τρόπο να διαβάσει την έξοδο και περιμένετε μέχρι να ολοκληρωθεί.

Απαντήθηκε 24/08/2008 στις 08:05
πηγή χρήστη

ψήφοι
1

Θέλετε υποεπεξεργασία . Κοιτάξτε ειδικά σε Popen στην 17.1.1 και να επικοινωνούν σε 17.1.2.

Απαντήθηκε 24/08/2008 στις 08:27
πηγή χρήστη

ψήφοι
9

Αν μιλάμε για το διερμηνέα python ή CMD.exe που είναι η «μητρική» του σεναρίου σας, τότε όχι, δεν είναι δυνατόν. Σε κάθε POSIX-όπως το σύστημα (τώρα τρέχετε τα Windows, όπως φαίνεται, και ότι θα μπορούσε να έχει κάποια ιδιορρυθμία που δεν γνωρίζουν, YMMV) κάθε διεργασία έχει τρία ρεύματα, την κανονική είσοδο, τυπική έξοδο και το τυπικό σφάλμα. Bu προεπιλογή (όταν εκτελείται σε μια κονσόλα) αυτά κατευθύνονται στην κονσόλα, αλλά ανακατεύθυνση είναι δυνατόν χρησιμοποιώντας την σημειογραφία σωλήνα:

python script_a.py | python script_b.py

Αυτό δένει το πρότυπο ρεύμα εξόδου του σεναρίου Α του προτύπου ρεύμα εισόδου του σεναρίου σφάλματος B. Πρότυπο ακόμα πηγαίνει στην κονσόλα σε αυτό το παράδειγμα. Δείτε το άρθρο σχετικά με τυποποιημένες ροές για Wikipedia.

Αν μιλάμε για μια διαδικασία παιδί, μπορείτε να το ξεκινήσει από πύθωνα, όπως έτσι (stdin είναι επίσης μια επιλογή, αν θέλετε αμφίδρομη επικοινωνία):

import subprocess
# Of course you can open things other than python here :)
process = subprocess.Popen(["python", "main.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
x = process.stderr.readline()
y = process.stdout.readline()
process.wait()

Δείτε το Python υπο- ενότητα για πληροφορίες σχετικά με τη διαχείριση της διαδικασίας. Για την επικοινωνία, οι σωλήνες process.stdin και process.stdout θεωρείται πρότυπο αντικείμενα αρχείο .

Για χρήση με σωλήνες, ανάγνωση από την κανονική είσοδο, όπως lassevk πρότεινε θέλετε να κάνετε κάτι σαν αυτό:

import sys
x = sys.stderr.readline()
y = sys.stdin.readline()

sys.stdin και sys.stdout είναι στάνταρ αντικείμενα αρχείο όπως σημειώθηκε παραπάνω, ορίζεται στο sys μονάδα. Ίσως επίσης να θέλετε να ρίξετε μια ματιά στο σωλήνες μονάδα.

Ανάγνωση δεδομένων με readline () όπως στο παράδειγμά μου είναι μια αρκετά αφελής τρόπος για να πάρει τα δεδομένα όμως. Εάν η έξοδος δεν είναι γραμμή προσανατολισμό ή ντετερμινιστική πιθανόν να θέλετε να εξετάσει δημοσκοπήσεων που, δυστυχώς, δεν λειτουργεί στα Windows, αλλά είμαι σίγουρος ότι υπάρχει κάποια εναλλακτική λύση εκεί έξω.

Απαντήθηκε 24/08/2008 στις 08:39
πηγή χρήστη

ψήφοι
3

Στην πραγματικότητα, σίγουρα μπορούμε, και αυτό είναι όμορφο, άσχημο, και τρελό την ίδια στιγμή!

Μπορείτε να αντικαταστήσετε sys.stdout και sys.stderr με StringIO αντικείμενα που συλλέγουν την έξοδο.

Εδώ είναι ένα παράδειγμα, το αποθηκεύσετε ως evil.py:

import sys
import StringIO

s = StringIO.StringIO()

sys.stdout = s

print "hey, this isn't going to stdout at all!"
print "where is it ?"

sys.stderr.write('It actually went to a StringIO object, I will show you now:\n')
sys.stderr.write(s.getvalue())

Όταν τρέχετε αυτό το πρόγραμμα, θα δείτε ότι:

  • τίποτα δεν πήγε στο stdout (όπου εκτύπωσης συνήθως εκτυπώνει έως)
  • Η πρώτη συμβολοσειρά που είναι γραμμένη σε stderr είναι αυτή που αρχίζει με «Είναι
  • Οι επόμενες δύο γραμμές είναι αυτοί που συλλέχθηκαν στο αντικείμενο StringIO

Αντικατάσταση sys.stdout / err όπως αυτό είναι μια εφαρμογή για το τι λέγεται monkeypatching. Απόψεις μπορεί να διαφέρουν κατά πόσον ή όχι αυτό είναι «υποστηρίζεται», και αυτό είναι σίγουρα ένα άσχημο hack, αλλά έχει σώσει μπέικον μου, όταν προσπαθεί να τυλίξει γύρω από την εξωτερική ουσία μία ή δύο φορές.

Δοκιμασμένο σε Linux, όχι για τα Windows, αλλά θα πρέπει να λειτουργούν το ίδιο καλά. Επιτρέψτε μου να ξέρω αν λειτουργεί στα Windows!

Απαντήθηκε 26/08/2008 στις 22:16
πηγή χρήστη

ψήφοι
4

Νομίζω ότι μπορώ να σας επισημάνω μια καλή απάντηση για το πρώτο σκέλος της ερώτησής σας.

1. Είναι δυνατόν να συλλάβει εξόδου Python διερμηνέα από την Python script;

Η απάντηση είναι « ναι », και προσωπικά μου αρέσει η εξής αρθεί από τα παραδείγματα του PEP 343 - Η «με το» Δήλωση έγγραφο.

from contextlib import contextmanager
import sys

@contextmanager
def stdout_redirected(new_stdout):
    saved_stdout = sys.stdout
    sys.stdout = new_stdout
    try:
        yield None
    finally:
        sys.stdout.close()
        sys.stdout = saved_stdout

Και χρησιμοποιείται σαν αυτό:

with stdout_redirected(open("filename.txt", "w")):
    print "Hello world"

Μια ωραία πτυχή του θέματος είναι ότι μπορεί να εφαρμοστεί επιλεκτικά γύρω από ένα μόνο μέρος της εκτέλεσης ενός σεναρίου, και όχι όλη την έκταση της, και παραμένει σε ισχύ ακόμη και όταν οι unhandled εξαιρέσεις που έχουν προκύψει στο πλαίσιο του. Αν έχετε ανοίξει εκ νέου το αρχείο σε προσάρτησης-mode μετά την πρώτη χρήση του, μπορείτε να συγκεντρώσετε τα αποτελέσματα σε ένα ενιαίο αρχείο:

with stdout_redirected(open("filename.txt", "w")):
    print "Hello world"

print "screen only output again"

with stdout_redirected(open("filename.txt", "a")):
    print "Hello world2"

Φυσικά, τα παραπάνω θα μπορούσε να επεκταθεί και να ανακατευθύνει επίσης sys.stderrστο ίδιο ή σε άλλο αρχείο. Επίσης δείτε αυτό την απάντηση σε σχετική ερώτηση.

Απαντήθηκε 31/07/2010 στις 15:40
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more