Τα πάντα για την Python

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 22 Ιουν 2012, 01:03

Τελικά μια χαρά δουλεύουν τα code samples. Μπερδεύτηκα για άλλο λόγο.

Το ffmpeg στην έξοδο του χρησιμοποιεί τον ειδικό χαρακτήρα '\r' και έτσι μπερδευόμουν απ' το αποτέλεσμα.
Τώρα όμως έχω άλλο θέμα. Για να αντιμετωπίσω το πρόβλημα με το '\r' χρησιμοποιώ το παρακάτω:
Κώδικας: Επιλογή όλων
import subprocess, shlex

command = shlex.split(r'ffmpeg -y -i /foo/bar1 /foo/bar2 2>&1 | tr \\r \\n')
subprocess.Popen(command)


Όταν τρέχω την εντολή κατευθείαν σε τερματικό δουλεύει σωστά και η μετατροπή γίνεται κανονικά.
Όταν όμως την τρέχω μέσω της subprocess.Popen() απ' το python script παίρνω το παρακάτω αποτέλεσμα:
Κώδικας: Επιλογή όλων
ffmpeg version 0.8.3-4:0.8.3-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav developers
built on Jun 12 2012 16:52:09 with gcc 4.6.3
*** THIS PROGRAM IS DEPRECATED ***
This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
[flv @ 0x13947a0] Estimating duration from bitrate, this may be inaccurate

Seems stream 0 codec frame rate differs from container frame rate: 49.97 (4997/100) -> 25.00 (25/1)
Input #0, flv, from '/home/ilias/ha.flv':
Metadata:
starttime : 0
totalduration : 65
totaldatarate : 409
bytelength : 3323117
canseekontime : true
sourcedata : B3E01264AHH1337979092096721
purl :
pmsg :
Duration: 00:01:04.51, start: 0.000000, bitrate: 412 kb/s
Stream #0.0: Video: h264 (Main), yuv420p, 320x240 [PAR 1:1 DAR 4:3], 275 kb/s, 25 tbr, 1k tbn, 49.97 tbc
Stream #0.1: Audio: aac, 44100 Hz, stereo, s16, 136 kb/s
Unable to find a suitable output format for '2>&1'

Αν πάλι χρησιμοποιήσω την os.system() χωρίς να αλλάξω κάτι άλλο, δουλεύει πάλι μια χαρά! :problem: :wtf:

Edit:
Το πρόβλημα ήταν ότι για να χρησιμοποιήσεις ανακατεύθυνση εισόδου/εξόδου με την subprocess πρέπει να θέσεις shell=True ή να το κάνεις χρησιμοποιώντας τα stdout, stderr κλπ.
Το σφάλμα ήταν στο '2>&1'.
Τελευταία επεξεργασία από Ilias95 και 22 Ιουν 2012, 01:44, έχει επεξεργασθεί 1 φορά/ες συνολικά
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό pmav99 » 22 Ιουν 2012, 01:41

Ηλία, δεν έχω ιδέα από το ffmpeg, αλλά όταν βάζεις raw string τότε δε χρειάζεται να κάνεις escape τα backslash. Δηλαδή το σωστό νομίζω είναι ένα από τα ακόλουθα δύο:
Μορφοποιημένος Κώδικας: Επιλογή όλων
'ffmpeg -y -i /foo/bar1 /foo/bar2 2>&1 | tr \\r \\n'
r'ffmpeg -y -i /foo/bar1 /foo/bar2 2>&1 | tr \r \n'


Δοκίμασε αν θες και με triple quotes (και πάλι δε χρειάζεται escape τα slashes).
pmav99
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 574
Εγγραφή: 05 Ιούλ 2008, 14:29
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 22 Ιουν 2012, 01:47

@pmav99
Δεν είναι escape. Έτσι πρέπει να είναι η εντολή στο tr.
Σημείωση: έκανα edit στο τελευταίο μου post.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό medigeek » 22 Ιουν 2012, 02:25

Το 2>&1 και τα άλλα είναι shell specific... χρειάζεσαι bash για να εκτελεστεί σωστά. :)
Βασικά στέλνει και κατευθύνει ό,τι γράφεται στο std error (2) να γραφτεί στο std out (1)

stderr.py -- Στέλνει χαρακτήρες στο standard error (stderr):
Μορφοποιημένος Κώδικας: Επιλογή όλων
import sys, time
for i in range(1,5):
if (i%2):
sys.stderr.write("prints time=3.80 and some other stuff\n")
else:
sys.stderr.write("test\n")
time.sleep(2)


test.py:
Μορφοποιημένος Κώδικας: Επιλογή όλων
import subprocess
import sys
import re

child = subprocess.Popen("python stderr.py", shell=True, stderr=subprocess.PIPE)
complete = False
while True:
out = child.stderr.readline()
out = out.strip()
if out == '' and child.poll() != None:
break
m = re.search("time=([0-9.]+)", out)
if out != '' and m and m.group(1):
print("Time left: {0}".format(m.group(1)))


Τα βάζεις στον ίδιο φάκελο και εκτελείς το test.py
Αν δεν θέλεις το stderr, αλλά το stdout, τότε αλλάζεις το stderr με το stdout.

Πηγή: http://stackoverflow.com/questions/2525 ... ess-output
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 22 Ιουν 2012, 03:12

@medigeek
Πρώτα απ' όλα ευχαριστώ για τον χρόνο σου! :)

Το παράδειγμα που δίνεις δουλεύει τέλεια όπως είναι.
Το πρόβλημα είναι ότι δεν μπορώ να το κάνω να δουλέψει με τίποτα σε μία μετατροπή με το ffmpeg.
Έχω την εντύπωση ότι για αυτό ευθύνεται πάλι το '\r' που βάζει στις εξόδους του το ffmpeg και μας τα χαλάει.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό medigeek » 22 Ιουν 2012, 09:56

Χρησιμοποίησε αυτόν τον κώδικα:
Κώδικας: Επιλογή όλων
import subprocess
import sys
import re

child = subprocess.Popen("ffmpeg ...", shell=True, stderr=subprocess.PIPE)
complete = False
while True:
out = child.stderr.readline()
out = out.strip()
if out == '' and child.poll() != None:
break
if out != '':
print(out.replace("\r","\\r").replace("\n","\\n"))


Αντικατέστησε το "ffmpeg ..." με την εντολή που κάνει μετατροπή για να δούμε το output... Άλλαξα τις τελευταίες γραμμές για να εμφανίσει τους χαρακτήρες \r και \n
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Ilias95 » 22 Ιουν 2012, 11:48

Ορίστε η έξοδος:
Κώδικας: Επιλογή όλων
ilias@ilias-pc:~/paok$ python test.py
ffmpeg version 0.8.3-4:0.8.3-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav developers
built on Jun 12 2012 16:52:09 with gcc 4.6.3
*** THIS PROGRAM IS DEPRECATED ***
This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/ilias/new.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2012-05-30 14:18:13
Duration: 00:03:58.58, start: 0.000000, bitrate: 1442 kb/s
Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720, 1291 kb/s, 24 fps, 24 tbr, 48 tbn, 48 tbc
Metadata:
creation_time : 1970-01-01 00:00:00
Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 149 kb/s
Metadata:
creation_time : 2012-05-30 14:18:14
[buffer @ 0xf7fd00] w:1280 h:720 pixfmt:yuv420p
Output #0, flv, to '/home/ilias/new.flv':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2012-05-30 14:18:13
encoder : Lavf53.21.0
Stream #0.0(und): Video: flv, yuv420p, 1280x720, q=2-31, 200 kb/s, 1k tbn, 24 tbc
Metadata:
creation_time : 1970-01-01 00:00:00
Stream #0.1(und): Audio: adpcm_swf, 44100 Hz, stereo, s16, 352 kb/s
Metadata:
creation_time : 2012-05-30 14:18:14
Stream mapping:
Stream #0.0 -> #0.0
Stream #0.1 -> #0.1
Press ctrl-c to stop encoding
frame= 31 fps= 0 q=31.0 size= 467kB time=0.97 bitrate=3927.7kbits/s \rframe= 62 fps= 59 q=31.0 size= 1151kB time=2.46 bitrate=3831.7kbits/s \rframe= 105 fps= 68 q=31.0 size= 1498kB time=3.90 bitrate=3144.8kbits/s \rframe= 149 fps= 73 q=31.0 size= 1948kB time=5.85 bitrate=2727.7kbits/s \rframe= 183 fps= 71 q=24.8 size= 2617kB time=7.34 bitrate=2922.0kbits/s \rframe= 213 fps= 69 q=31.0 size= 2987kB time=8.78 bitrate=2788.0kbits/s \rframe= 241 fps= 67 q=31.0 size= 3266kB time=9.75 bitrate=2743.5kbits/s \rframe= 270 fps= 66 q=31.0 size= 3474kB time=10.73 bitrate=2653.0kbits/s \rframe= 298 fps= 65 q=31.0 size= 3761kB time=12.21 bitrate=2522.8kbits/s \rframe= 327 fps= 64 q=24.8 size= 3938kB time=13.19 bitrate=2445.9kbits/s \rframe= 361 fps= 64 q=31.0 size= 4129kB time=14.63 bitrate=2312.4kbits/s \rframe= 407 fps= 66 q=31.0 size= 4372kB time=16.58 bitrate=2160.5kbits/s \rframe= 449 fps= 68 q=31.0 size= 4616kB time=18.53 bitrate=2040.6kbits/s \rframe= 487 fps= 68 q=31.0 size= 4840kB time=20.02 bitrate=1980.8kbits/s \rframe= 525 fps= 69 q=31.0 size= 5069kB time=21.46 bitrate=1935.6kbits/s \rframe= 565 fps= 69 q=31.0 size= 5298kB time=23.41 bitrate=1854.4kbits/s \rframe= 609 fps= 70 q=31.0 size= 5512kB time=24.89 bitrate=1814.0kbits/s \rframe= 652 fps= 71 q=31.0 size= 5767kB time=26.84 bitrate=1760.1kbits/s \rframe= 697 fps= 72 q=31.0 size= 5986kB time=28.79 bitrate=1703.0kbits/s \rframe= 741 fps= 73 q=31.0 size= 6227kB time=30.74 bitrate=1659.3kbits/s \rframe= 784 fps= 73 q=31.0 size= 6386kB time=32.18 bitrate=1625.4kbits/s \rframe= 825 fps= 74 q=31.0 size= 6662kB time=34.13 bitrate=1599.0kbits/s \rframe= 867 fps= 74 q=31.0 size= 6890kB time=35.62 bitrate=1584.6kbits/s \rframe= 912 fps= 75 q=31.0 size= 7145kB time=37.57 bitrate=1558.0kbits/s \rframe= 956 fps= 75 q=31.0 size= 7414kB time=39.52 bitrate=1536.7kbits/s \rframe= 983 fps= 74 q=31.0 size= 8011kB time=40.50 bitrate=1620.6kbits/s
video:33693kB audio:10299kB global headers:0kB muxing overhead 0.386772%
ilias@ilias-pc:~/paok$

Τι γίνεται όμως;
Με το που τρέχω το πρόγραμμα φτάνει μέχρι την γραμμή «Press ctrl-c to stop encoding».
Περιμένω κάποια δευτερόλεπτα να ολοκληρωθεί η μετατροπή και μετά εμφανίζεται όλη η υπόλοιπη έξοδος μαζεμένη.

Εικάζω ότι έχει να κάνει με την γραμμή:
Κώδικας: Επιλογή όλων
out = child.stderr.readline()


Φαντάζομαι ότι η readline() περιμένει να βρει τον χαρακτήρα '\n' για να επιστρέψει τιμή.
Επειδή από κάποιο σημείο ξεκινάν τα carriage return αργεί μέχρι να βρει το επόμενο '\n', πράγμα που γίνεται αφού ολοκληρωθεί η μετατροπή.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό clepto » 22 Ιουν 2012, 17:18

να ρωτήσω κάτι άλλο εγώ, όταν δημιουργώ ένα αρχείο με το tempfile πόσο παραμένει στο σύστημα;
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό simosx » 22 Ιουν 2012, 17:35

clepto έγραψε:να ρωτήσω κάτι άλλο εγώ, όταν δημιουργώ ένα αρχείο με το tempfile πόσο παραμένει στο σύστημα;


Γενικά η λειτουργία για tempfile έχει ως στόχο να δημιουργήσει αρχείο με νέο, μοναδικό όνομα, ώστε να μη σβήσει κάτι άλλο.
Παραμένει στο σύστημα μέχρι να το σβήσεις, εκτός και αν το ffmpeg (ή άλλα προγράμματα) είναι ρυθμισμένα να σβήνουν τα tempfile κατά την ολοκλήρωσή τους.
Αν το αρχείο πάει στο /tmp, τότε παραμένει μέχρι τον τερματισμό λειτουργίας του Ubuntu, οπότε αυτόματα τα περιεχόμενα του /tmp σβήνονται.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό pmav99 » 22 Ιουν 2012, 20:01

Ειδικά στην Python, αν χρησιμοποιείς (που καλό είναι να το κάνεις) το module tempfile, τότε, ανάλογα με ποια συνάρτηση χρησιμοποιείς, τα αρχεία που δημιουργούνται μπορούν είτε να παραμείνουν είτε να καταστρέφονται μόλις τα κλείσεις.

http://docs.python.org/library/tempfile.html
pmav99
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 574
Εγγραφή: 05 Ιούλ 2008, 14:29
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι

cron