2013-12-09 4 views
1

Windows cmd에서 python 스크립트를 실행하려고합니다. 나는 리눅스에서 실행할 때 나는 filename18.txt하는 filename01.txt에서 숫자 파일을 통해Windows에서 여러 파일을 실행하는 python 스크립트 cmd

python myscript.py filename??.txt

가 간다를 넣고 그것을 작동합니다.

나는

python myscript.py filename*.txt

또는

python myscript.py filename**.txt

처럼 cmd를에서 실행하려하지만 일을 일부러. 만약 내가 Windows에서 하나의 파일에 대한 스크립트를 시도 cmd를 작동합니다.

문제가 발생할 수있는 단서가 있습니까? 감사합니다.

답변

1

유닉스 쉘은 파일 경로 패턴을 실제 파일로 변환 한 다음 그 결과를 프로그램에 전달합니다. (python myscript.py)

그러나 Windows cmd에서는 이러한 일이 발생하지 않습니다.

패턴과 일치하는 파일 목록을 보려면 glob.glob을 참조하십시오.

0

이러한 와일드 카드는 파이썬 스크립트를 실행하기 전에 "셸 (즉 bash) 수준"에서 확장됩니다. 그래서 문제는 파이썬이 아니라 Windows에서 사용하는 "쉘"에 있습니다. 아마 당신은 Windows 용 PowerShell이나 CygWin을 통한 bash를 사용해보십시오.

0

이 시도 :

FOR %X IN (filename*.txt) DO (python myscript.py %X) 

편집,이있는 박쥐를 만들고 그것을 시도 할 수 있습니다. 배치 파일

for %%f in ("filename*.txt") do python myscript.py "%%~nxf" 

%%f에서

setlocal EnableDelayedExpansion 
set files= 
FOR %%X IN (filename*.txt) DO set files=!files! %%X 
echo %files% 
python myscript.py %files% 
+0

이 하나가 작동하지만 내 스크립트의 목표는 모두 함께 (18 개) 파일을 플롯과 별도로 각 파일이 하나의 플롯을 .. 왜 그런지 알아? – user3041107

+0

다른 예가 추가되었습니다. 이렇게하면 % files %에서 "filename1.txt filename11.txt"와 같은 목록이 생성됩니다. – malexander

0

는 각 파일에 대한 참조를 얻을 것이다. 각각의 경우 스크립트를 실행하십시오. %%~nxf은 파일의 이름과 확장자로 확장됩니다. 편집 한 단일 %

명령 줄에서

, 대체 %% - 난 문제를 missunderstood. 다음 시도.

Windows에서 와일드 카드 인수의 기본 확장자는 없습니다 (here 참조). 따라서 같은 결과를 얻으려면 배치 파일이 필요합니다.그것은 매개 변수의 efect에도 보여 화면에 불필요한 실행을 방지하기 위해 (스크립트 호출 만 에코됩니다으로 뭔가를 사용하여 파일 목록을 연결하고보다 재사용 가능한 코드에 대한 파이썬 스크립트

@echo off 

    setlocal enabledelayedexpansion 

    set "fileList=" 
    for %%f in ("*.txt") do set "fileList=!fileList! "%%f"" 

    python myscript.py !fileList! 

    endlocal 

에 전달됩니다 제거 가)

@echo off 

    setlocal enableextensions 

    call :glob "*.txt" true fileList 
    echo python myscript.py %fileList% 

    echo. 

    call :glob "*.txt" false fileList 
    echo python myscript.py %fileList% 

    exit /b 

:glob pattern useFullPath outputList 
    setlocal enabledelayedexpansion 
    if /i "%~2"=="true" (set "_name=%%%%~ff") else (set "_name=%%%%~nxf") 
    set "_list=" 
    for %%f in ("%~1") do set "_list=!_list! "%_name%"" 
    endlocal & if not "%~3"=="" set "%~3=%_list%" 
+0

이 파일도 잘 작동하지만 각 파일을 개별적으로 처리해야하며 함께 사용해야하는 것은 아닙니다. 18 자의 파일을 하나의 플롯으로 플롯해야한다. – user3041107

+0

@ user3041107 : 업데이트. 미안하지만, 나는 그것을 잘못 이해했다. –

0

falsetru으로 메모를 같은 의도 일 때 정답은 glob.glob()하므로, Windows에서 쉘은, 당신을 위해 와일드 카드를 확장하지 않습니다. 모든 명령 행 인수를 반복하고 각각을 확장해야합니다. 이것은 Linux/UNIX에서도 잘 작동합니다. 와일드 카드가없는 인수 (쉘이 제공하는 것입니다)의 확장은 변경되지 않은 파일 이름이기 때문입니다. 그래서 이런 일이, 게으른 평가를 사용하는 인수의 잠재적으로 많은 수의 처리하는 :

from sys import argv 
from glob import glob 
from itertools import chain, islice 

for name in chain.from_iterable(glob(name) for name in islice(argv, 1, None)): 
    # do something with each file 
관련 문제