우리는 일반적으로 C++ 또는 기타 하위 수준 언어를 통해 복잡한 기능 모듈을 구현하고, 데이터를 쿼리하기 위해 웹 기반 데모를 구축해야 하는 등의 요구 사항에 직면합니다. Python 언어의 강력함과 단순성으로 인해 데모 구축에 매우 적합합니다. Flask 프레임워크와 jinja2 모듈 기능은 Python에 편리한 웹 개발 기능을 제공합니다. 동시에 Python은 다른 언어의 코드와 쉽게 상호 작용할 수 있습니다. 따라서 우리는 Demo 개발 도구로 Python을 선택했습니다. 우리가 호출해야 하는 모듈(기본 서비스 제공)이 표준 입력을 통해 루프에서 데이터를 읽고 처리 후 표시된 출력에 결과를 쓴다고 가정합니다. 이 시나리오는 Linux 환경에서 매우 일반적이며 Linux의 강력한 리디렉션 기능에 의존합니다. . 그러나 불행하게도 기본 모듈에는 초기화 프로세스가 너무 많기 때문에 모든 쿼리 요청에 대해 기본 모듈을 호출하는 하위 프로세스를 다시 생성할 수 없습니다. 해결책은 자식 프로세스를 한 번만 생성한 다음 각 요청에 대해 파이프를 통해 자식 프로세스와 상호 작용하는 것입니다.
Python의 하위 프로세스 모듈은 Linux 시스템 호출 fork 및 exec와 유사하게 하위 프로세스를 쉽게 생성할 수 있습니다. subprocess 모듈의 Popen 개체는 비차단 방식으로 외부 실행 프로그램을 호출할 수 있으므로 Poen 개체를 사용하여 요구 사항을 충족합니다. 하위 프로세스의 표준 입력 stdin에 데이터를 쓰려면 Popen 객체를 생성할 때 stdin 매개변수를 subprocess.PIPE로 지정해야 합니다. 마찬가지로 하위 프로세스의 표준 출력에서 데이터를 읽어야 하는 경우에는 다음과 같습니다. Popen 객체를 생성할 때 stdout 매개변수를 subprocess.PIPE로 지정해야 합니다. 먼저 간단한 예를 살펴보겠습니다.
from subprocess import Popen, PIPE p = Popen('less', stdin=PIPE, stdout=PIPE) p.communicate('Line number %d.\n' % x)
통신 함수는 하위 프로세스의 표준 출력과 오류를 표시하는 출력 데이터가 포함된 튜플(stdoutdata, stderrdata)을 반환합니다. . 그러나 Popen 객체의 통신 함수는 상위 프로세스를 차단하고 파이프도 닫으므로 각 Popen 객체는 통신 함수를 한 번만 호출할 수 있습니다. 요청이 여러 개인 경우 Popen 객체를 다시 생성해야 합니다(자식 프로세스 다시 초기화). 우리의 요구를 충족시킬 수 없습니다.
따라서 Popen 객체의 stdin 및 stdout 객체에 데이터를 쓰고 읽어야만 우리의 요구 사항을 충족할 수 있습니다. 그러나 불행히도 하위 프로세스 모듈은 기본적으로 하위 프로세스가 종료될 때 한 번만 표준 출력을 실행하고 읽습니다. 하위 프로세스와 os.popen*은 모두 한 번만 입력과 출력을 허용하고 프로세스가 종료될 때만 출력을 읽을 수 있습니다.
몇몇 조사 끝에 하위 프로세스가 fcntl 함수를 통해 처리될 수 있다는 것을 발견했습니다. fcntl 모듈 우리의 목적을 달성하기 위해 프로세스의 표준 출력이 비차단 모드로 변경됩니다. 오랫동안 나를 괴롭혔던 이 문제가 드디어 완벽하게 해결되었습니다. 코드는 다음과 같습니다.
#!/usr/bin/python # -*- coding: utf-8 -*- # author: weisu.yxd@taobao.com from subprocess import Popen, PIPE import fcntl, os import time class Server(object): def __init__(self, args, server_env = None): if server_env: self.process = Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE, env=server_env) else: self.process = Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) flags = fcntl.fcntl(self.process.stdout, fcntl.F_GETFL) fcntl.fcntl(self.process.stdout, fcntl.F_SETFL, flags | os.O_NONBLOCK) def send(self, data, tail = '\n'): self.process.stdin.write(data + tail) self.process.stdin.flush() def recv(self, t=.1, e=1, tr=5, stderr=0): time.sleep(t) if tr < 1: tr = 1 x = time.time()+t r = '' pr = self.process.stdout if stderr: pr = self.process.stdout while time.time() < x or r: r = pr.read() if r is None: if e: raise Exception(message) else: break elif r: return r.rstrip() else: time.sleep(max((x-time.time())/tr, 0)) return r.rstrip() if __name__ == "__main__": ServerArgs = ['/home/weisu.yxd/QP/trunk/bin/normalizer', '/home/weisu.yxd/QP/trunk/conf/stopfile.txt'] server = Server(ServerArgs) test_data = '在云端', '云梯', '摩萨德', 'Alisa', 'iDB', '阿里大数据' for x in test_data: server.send(x) print x, server.recv()
또한 일부 외부 프로그램을 호출할 때 다음과 같이 해당 환경 변수를 지정해야 할 수도 있습니다.
my_env = os.environ my_env["LD_LIBRARY_PATH"] = "/path/to/lib" server = server.Server(cmd, my_env)

PythonlistsCanstoreAnyDatAtype, ArrayModuLearRaysStoreOneType 및 NUMPYARRAYSAREFORNUMERICALPUTATION.1) LISTSAREVERSATILEBUTLESSMEMORY-EFFICENT.2) ARRAYMODUERRAYRAYRAYSARRYSARESARESARESARESARESARESAREDOREDORY-UNFICEDONOUNEOUSDATA.3) NumpyArraysUraysOrcepperperperperperperperperperperperperperperperferperferperferferpercient

whenyouattempttoreavalueofthewrongdatatypeinapythonaphonarray, thisiSdueTotheArrayModule의 stricttyPeenforcement, theAllElementStobeofthesAmetypecified bythetypecode.forperformancersassion, arraysaremoreficats the thraysaremoreficats thetheperfication the thraysaremorefications는

Pythonlistsarepartoftsandardlardlibrary, whileraysarenot.listsarebuilt-in, 다재다능하고, 수집 할 수있는 반면, arraysarreprovidedByTearRaymoduledlesscommonlyusedDuetolimitedFunctionality.

thescriptIsrunningwithHongpyThonversionDueCorRectDefaultTerpretersEttings.tofixThis : 1) checktheDefaultPyThonVersionUsingPyThon-VersionorPyThon3- version.2) usvirtual-ErondmentsBythePython.9-Mvenvmyenv, 활성화, 및 파괴

PythonArraysSupportVariousOperations : 1) SlicingExtractsSubsets, 2) 추가/확장 어드먼트, 3) 삽입 값 삽입 ATSpecificPositions, 4) retingdeletesElements, 5) 분류/ReversingChangesOrder 및 6) ListsompectionScreateNewListSbasedOnsistin

NumpyArraysareSentialplosplicationSefficationSefficientNumericalcomputationsanddatamanipulation. Theyarcrucialindatascience, MachineLearning, Physics, Engineering 및 Financeduetotheiribility에 대한 handlarge-scaledataefficivally. forexample, Infinancialanyaly

UseanArray.ArrayOveralistInpyThonWhendealingwithhomogeneousData, Performance-CriticalCode, OrinterFacingwithCcode.1) HomogeneousData : ArraysSaveMemorywithtypepletement.2) Performance-CriticalCode : arraysofferbetterporcomanceFornumericalOperations.3) Interf

아니요, NOTALLLISTOPERATIONARESUPPORTEDBYARRARES, andVICEVERSA.1) ArraySDONOTSUPPORTDYNAMICOPERATIONSLIKEPENDORINSERTWITHUTRESIGING, WHITHIMPACTSPERFORMANCE.2) ListSDONOTEECONSTANTTIMECOMPLEXITEFORDITITICCESSLIKEARRAYSDO.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경
