python은 Windows 플랫폼의 경로에 공백이 있는 문제를 해결합니다.

최근 윈도우즈의 중간부품을 채집할 때 파일 경로에 빈칸이 있는 문제가 발생했습니다.
예를 들어 Aapche의 설치 경로는 D:\Program Files\Apache Software Foundation\Apache2.2입니다.
아파치를 수집하려면 프로필 D:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd를 읽어야 합니다.conf
일부 D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd를 실행합니다.exe-v 이런 명령.
프로필을 읽는 데는 문제가 없습니다. 왜냐하면python 코드를 사용해서 파일을 열고, 파일을 읽고, 한 줄씩 훑어보고, 정규 일치나 문자열을 비교하면 정보를 얻을 수 있습니다. 예를 들어 프로필을 읽고 포트 번호를 얻는 것입니다.

   port_list=[] 
   with open(httpd_conf, "r") as f:
    file_list = f.readlines()
    regex = ur"^Listen\s*(\S*?:)*(\d+)\s*$"
    pattern_listener = re.compile(regex)
    for item in file_list:
     listener_list = pattern_listener.findall(item)
     if listener_list:
      for port_info in listener_list:
       if port_info:
        port = port_info[1]
        if port and port.strip():
         port_list.append(port.strip()) 
다음은 D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd입니다.exe-v 명령을 통해 정보를 얻을 수 있습니다.
httpd.exe-v는apache의 버전 정보를 가져옵니다.cmd 명령줄에 직접 입력하면 다음과 같이 표시됩니다. 
D:\>D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe -v
'D:\Program'은 내부 또는 외부 명령이 아니며 실행 가능한 프로그램이나 일괄 처리 파일도 아닙니다.  
빈칸 문제가 있어서 검색해 보니 비교적 좋은 해결 방법은 명령을 쌍인용부호로 일으키는 것이다. 아래의 두 가지 작법은 모두 가능하다.

D:\>"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" -v
Server version: Apache/2.2.22 (Win32)
Server built: Jan 28 2012 11:16:39

D:\>"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" "-v"
Server version: Apache/2.2.22 (Win32)
Server built: Jan 28 2012 11:16:39
다음으로 우리는python에서 os를 사용합니다.popen().read () 어떻게 하는지 시험해 보세요.

>>> import os
>>> cmd='"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" -v'
>>> os.popen(cmd).read()  -- , \ , r ,cmd cmd1 
''
>>> cmd            --\b , \x08
'"D:\\Program Files\\Apache Software Foundation\\Apache2.2\x08in\\httpd.exe" -v'
>>> cmd1=r'"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" -v'
>>> cmd1
'"D:\\Program Files\\Apache Software Foundation\\Apache2.2\\bin\\httpd.exe" -v'

>>> os.popen(cmd1).read()
'Server version: Apache/2.2.22 (Win32)
Server built: Jan 28 2012 11:16:39
' >>>
다음은 비교적 복잡한 명령을 다시 보겠습니다, httpd.exe "-V | find"서버 MPM "이것은 아파치의 실행 모드를 가져오는 데 사용됩니다. 윈도우즈 아래는
WinNT, 아까의 방식대로 cmd 명령줄에서 실행하는 것은 문제없습니다.
D:\>"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe"-V|find "Server MPM"Server MPM: WinNT   
그럼, 우리는 계속 그를python에 이식하고, 계속os를 사용합니다.popen().read().결과는 아래와 같이 결과가 나오지 않는다.
그러니까 이런 파라미터가 비교적 많은데 이런 방법을 쓰면 안 된다.

>>> cmd1=r'"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" -V|find "Server MPM" '
>>> os.popen(cmd1).read()
''

>>> cmd2=r'"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" -V|find Server MPM '
>>> os.popen(cmd1).read()
''

>>> cmd3=r'"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" "-V|find Server MPM" '
>>> os.popen(cmd1).read()
''
관련 자료를 조회한 후subprocess를 사용할 수 있습니다.os 대신 Popen () 을 사용합니다.popen () 이 방법,
그러나 집행 후 나온 결과는 원하는 것이 아니기 때문에 이 방법도 효과를 거둘 수 없다(아래).

>>> import subprocess
>>> cmd=r'D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe -V|find "Server MPM"'
>>> cmd
'D:\\Program Files\\Apache Software Foundation\\Apache2.2\\bin\\httpd.exe -V|find "Server MPM"'
>>> ps = subprocess.Popen(cmd)
>>> Server version: Apache/2.2.22 (Win32)
Server built: Jan 28 2012 11:16:39
Server's Module Magic Number: 20051115:30
Server loaded: APR 1.4.5, APR-Util 1.4.1
Compiled using: APR 1.4.5, APR-Util 1.4.1
Architecture: 32-bit
Server MPM:  WinNT
 threaded:  yes (fixed thread count)
 forked:  no
이러한 결과를 보고 괴로움을 포기하고 최종적으로 곡선 구국 방안을 선택했고python의os모듈로 httpd에 선진적으로 들어갔다.exe가 있는 디렉터리입니다. 그 다음에 명령을 실행합니다.

>>> homepath="D:\Program Files\Apache Software Foundation\Apache2.2"
>>> BinPath = os.path.join(homepath, 'bin')
>>> os.chdir(BinPath)
>>> apache_model = os.popen('httpd.exe -V |find "Server MPM"').read()
>>> print apache_model
Server MPM:  WinNT
추가 지식:python 윈도우즈에서 경로를 얻을 때 중국어 처리가 있습니다
윈도우즈에서 os,path를 사용합니다.abspath(__file__)중국어 경로가 있을 때, 기본값은 비unicode 형식으로 바뀝니다.
이로 인해 다른 모듈에서 이 경로를 사용할 때 보고됩니다.
utf8' codec can't decode byte 0xb7 in position 14: invalid start byte
어떻게 처리할까요?
인터넷에서 바이두를 하나 만들었는데 해결 방법이 모두 타당하지 않으니 그래도 비통용적인 것이 좋겠지만 사용하기 쉽다.
아래와 같다
project_path = os.path.abspath(__file__.decode('gbk'))
이 방법으로 간단하고 편리하다.
자, 이상의python은 Windows 플랫폼의 경로에 빈칸이 있는 문제를 해결하고자 합니다. 바로 편집자가 여러분에게 공유한 모든 내용을 참고하고 저희를 많이 사랑해 주십시오.

좋은 웹페이지 즐겨찾기