On Mon, Sep 2, 2013 at 10:19 AM, learner404 <learner...@gmail.com> wrote: > > I can't understand why the command below works with os.system but not with > subprocess.Popen (on windows, recording video with FFMPEG.exe) > > cmd=('ffmpeg -f dshow -i video="%s" -f dshow -i audio="%s" -q 5 "%s"')% > (videoinputName, audioinputName, videoFileOutput) > os.system(cmd) > *works* > > subprocess.Popen(["ffmpeg","-f","dshow","-i",'video="%s"'%videoinputName, > "-f","dshow","-i",'audio="%s"'%audioinputName,"-q","5", > "%s"%videoFileOutput]) > *don't work* >>> [dshow @ 025984a0] Could not find video device. >>> video="QuickCam Orbit/Sphere AF": Input/output error
Popen joins the list into a string, as required by Windows CreateProcess(). It assumes the tokenizing rules used by Microsoft's C runtime. If that assumption is wrong, just switch to using a string instead of a list, with whatever custom quoting is required. I'd first try it like this: args = ['ffmpeg', '-f', 'dshow', '-i', 'video=%s' % videoinputName, '-f', 'dshow', '-i', 'audio=%s' % audioinputName, '-q', '5', videoFileOutput] Here's a simple script to print the raw command line, and also sys.argv. test.py import sys from ctypes import * windll.kernel32.GetCommandLineW.restype = c_wchar_p print(windll.kernel32.GetCommandLineW()) print(' '.join(sys.argv)) system() vs Popen(): >>> exe = sys.executable >>> cmdstr = '%s test.py video="QuickCam Orbit"' % exe >>> os.system(cmdstr) C:\Python27\python.exe test.py video="QuickCam Orbit" test.py video=QuickCam Orbit 0 >>> cmdlst = [exe, 'test.py', 'video="QuickCam Orbit"'] >>> subprocess.call(cmdlst) C:\Python27\python.exe test.py "video=\"QuickCam Orbit\"" test.py video="QuickCam Orbit" 0 Automatic vs manual quoting: >>> cmdlst2 = [exe, 'test.py', 'video=QuickCam Orbit'] >>> subprocess.call(cmdlst2) C:\Python27\python.exe test.py "video=QuickCam Orbit" test.py video=QuickCam Orbit 0 >>> subprocess.call(cmdstr) C:\Python27\python.exe test.py video="QuickCam Orbit" test.py video=QuickCam Orbit 0 > The reason I'm going with subprocess is to avoid to have the DOS window > coming in the forefront. > Any idea of what I'm doing wrong? Or any other way to hide or minimize the > DOS window? The startupinfo option can hide the window, including a console window: http://docs.python.org/2/library/subprocess.html#subprocess.STARTUPINFO By the way, unless you're running Windows 9x, a console window isn't "DOS". A console is hosted in a separate process (csrss.exe or conhost.exe). Multiple processes can attach to a single console. If a process doesn't create or inherit a console automatically, it can attach to an existing one (kernel32.AttachConsole) or allocate one manually (kernel32.AllocConsole). _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor