මෙම ප්රශ්නයට පිළිතුර රඳා පවතින්නේ ඔබ භාවිතා කරන පයිතන් අනුවාදය මත ය. සරලම ප්රවේශය නම් subprocess.check_outputශ්රිතය භාවිතා කිරීමයි :
>>> subprocess.check_output(['ls', '-l'])
b'total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n'
check_outputආදාන ලෙස තර්ක පමණක් ගන්නා තනි වැඩසටහනක් ක්රියාත්මක කරයි. 1 එය මුද්රණය කළ ආකාරයටම ප්රති result ලය ලබා දෙයි stdout. ඔබට ආදානය ලිවීමට අවශ්ය නම් stdin, runහෝ Popenඅංශ වෙත ඉදිරියට යන්න . ඔබට සංකීර්ණ ෂෙල් විධාන ක්රියාත්මක කිරීමට අවශ්ය නම් shell=True, මෙම පිළිතුර අවසානයේ ඇති සටහන බලන්න .
මෙම check_outputකාර්යය තවමත් පුළුල් භාවිතයේ පවතින (2.7+) පයිතන්ගේ සියලුම සංස්කරණ වල ක්රියා කරයි. 2 නමුත් වඩාත් මෑත සංස්කරණ සඳහා, එය තවදුරටත් නිර්දේශිත ප්රවේශය නොවේ.
පයිතන්ගේ නවීන අනුවාදයන් (3.5 හෝ ඊට වැඩි): run
ඔබ පයිතන් 3.5 හෝ ඊට වැඩි භාවිතා කරන්නේ නම් සහ පසුපසට අනුකූලතාවය අවශ්ය නොවේ නම් , නව runකාර්යය නිර්දේශ කෙරේ. එය subprocessමොඩියුලය සඳහා ඉතා සාමාන්ය, ඉහළ මට්ටමේ API එකක් සපයයි . වැඩසටහනක ප්රතිදානය ග්රහණය කර ගැනීම සඳහා, subprocess.PIPEධජය stdoutයතුරු පද තර්කයට යොමු කරන්න. ඉන්පසු stdoutආපසු ලබා දුන් CompletedProcessවස්තුවේ ගුණාංගයට ප්රවේශ වන්න :
>>> import subprocess
>>> result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE)
>>> result.stdout
b'total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n'
ප්රතිලාභ අගය bytesවස්තුවකි, එබැවින් ඔබට නිසි නූලක් අවශ්ය නම් ඔබට decodeඑය අවශ්ය වේ . කැඳවූ ක්රියාවලිය උපකල්පනය කිරීමෙන් යූටීඑෆ් -8 කේතනය කළ නූලක් ලැබේ:
>>> result.stdout.decode('utf-8')
'total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n'
මේ සියල්ල එක් ලයිනර් එකකට සම්පීඩනය කළ හැකිය:
>>> subprocess.run(['ls', '-l'], stdout=subprocess.PIPE).stdout.decode('utf-8')
'total 0\n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 files\n'
ඔබට ක්රියාවලියට ආදානය යැවීමට අවශ්ය නම් stdin, bytesවස්තුවක් inputයතුරු පදයට යොමු කරන්න:
>>> cmd = ['awk', 'length($0) > 5']
>>> input = 'foo\nfoofoo\n'.encode('utf-8')
>>> result = subprocess.run(cmd, stdout=subprocess.PIPE, input=input)
>>> result.stdout.decode('utf-8')
'foofoo\n'
සමත් වීමෙන් stderr=subprocess.PIPE(ග්රහණය කර ගැනීමට result.stderr) හෝ stderr=subprocess.STDOUT( result.stdoutනිත්ය ප්රතිදානය සමඟ ග්රහණය කර ගැනීමෙන් ) ඔබට දෝෂ අල්ලා ගත හැකිය . ආරක්ෂාව ගැන සැලකිලිමත් නොවන විට, shell=Trueපහත සටහන් වල විස්තර කර ඇති පරිදි සම්මත කිරීමෙන් ඔබට වඩාත් සංකීර්ණ ෂෙල් විධාන ක්රියාත්මක කළ හැකිය .
පැරණි දේවල් කරන ක්රමයට සාපේක්ෂව මෙය ටිකක් සංකීර්ණ බවක් එක් කරයි. නමුත් එය ගෙවීම වටී යැයි මම සිතමි: දැන් ඔබට runශ්රිතය සමඟ පමණක් කළ යුතු ඕනෑම දෙයක් කළ හැකිය .
පයිතන්ගේ පැරණි අනුවාදයන් (2.7-3.4): check_output
ඔබ පයිතන්ගේ පැරණි අනුවාදයක් භාවිතා කරන්නේ නම් හෝ පසුපසට අනුකූලතාවයක් අවශ්ය නම්, check_outputඉහත විස්තර කර ඇති පරිදි ඔබට ශ්රිතය භාවිතා කළ හැකිය . පයිතන් 2.7 සිට එය ලබා ගත හැකිය.
subprocess.check_output(*popenargs, **kwargs)
එය Popen(පහත බලන්න) හා සමාන තර්ක ගෙන, වැඩසටහනේ ප්රතිදානය අඩංගු නූලක් ලබා දෙයි. මෙම පිළිතුරේ ආරම්භයට වඩාත් සවිස්තරාත්මක භාවිත උදාහරණයක් ඇත. Python 3.5 හා වැඩි දී, check_outputක්රියාත්මක කිරීමට හා සමාන වේ runසමග check=Trueහා stdout=PIPE, හා පමණක් නැවත stdoutබලමු ඩේටා.
ඔබ සමත් හැකි stderr=subprocess.STDOUTනමුත් python, සමහර සංස්කරණවල පසුකර - එම වරද පණිවිඩ නැවත නිෂ්පාදනය ඇතුළත් තහවුරු කිරීම සඳහා stderr=subprocess.PIPEකිරීමට check_outputහැකි හේතුවක් ඩෙඩ්ලොක්ස් . ආරක්ෂාව ගැන සැලකිලිමත් නොවන විට, shell=Trueපහත සටහන් වල විස්තර කර ඇති පරිදි සම්මත කිරීමෙන් ඔබට වඩාත් සංකීර්ණ ෂෙල් විධාන ක්රියාත්මක කළ හැකිය .
ඔබට ක්රියාවලියට නල මාර්ගයක් stderrයැවීමට හෝ ආදානය කිරීමට අවශ්ය නම් check_output, කාර්යය ඉටු නොවේ. බලන්න Popenඑම නඩුව පහත උදාහරණ.
පයිතන්ගේ සංකීර්ණ යෙදුම් සහ පැරණි අනුවාදයන් (2.6 සහ ඊට පහළ): Popen
ඔබට ගැඹුරු පසුගාමී අනුකූලතාවයක් අවශ්ය නම්, හෝ ඔබට සපයනවාට වඩා නවීන ක්රියාකාරිත්වයක් check_outputඅවශ්ය නම්, ඔබට සෘජුවම Popenවස්තූන් සමඟ වැඩ කිරීමට සිදුවනු ඇත , එමඟින් උපප්රොසෙස් සඳහා පහත් මට්ටමේ API සම්බන්ධ කරයි.
මෙම Popenඉදිකිරීමටත් එක්කෝ පිළිගන්නා එක් විධානයක් තර්ක තොරව, හෝ ලැයිස්තුවක් ලැයිස්තුවේ වෙනම අයිතමයක් ලෙස එක් එක්, විධාන අඩංගු ප්රථම අයිතමයක් ලෙස, තර්ක ඕනෑම අංකය සඳහන්. shlex.splitනිසි ලෙස ආකෘතිගත කළ ලැයිස්තු වලට නූල් විග්රහ කිරීමට උදව් කළ හැකිය. ක්රියාවලි IO කළමනාකරණය සහ පහත් මට්ටමේ වින්යාසය සඳහා Popenවස්තු විවිධ තර්ක රාශියක් පිළිගනී .
ආදානය යැවීම සහ ප්රතිදානය ග්රහණය කර ගැනීම communicateසෑම විටම පාහේ කැමති ක්රමයකි. මෙන්:
output = subprocess.Popen(["mycmd", "myarg"],
stdout=subprocess.PIPE).communicate()[0]
හෝ
>>> import subprocess
>>> p = subprocess.Popen(['ls', '-a'], stdout=subprocess.PIPE,
... stderr=subprocess.PIPE)
>>> out, err = p.communicate()
>>> print out
.
..
foo
ඔබ සකසන්නේ නම් stdin=PIPE, communicateක්රියාවලිය හරහා දත්ත යැවීමට ද ඔබට ඉඩ දෙයි stdin:
>>> cmd = ['awk', 'length($0) > 5']
>>> p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
... stderr=subprocess.PIPE,
... stdin=subprocess.PIPE)
>>> out, err = p.communicate('foo\nfoofoo\n')
>>> print out
foofoo
සටහන ආරොන් ශාලාව පිළිතුර ඇතැම් පද්ධති මත, ඔබ සකස් කර ගැනීමට අවශ්ය විය හැකි බවයි වන stdout, stderrහා stdinසියලු PIPE(හෝ DEVNULLලබා ගැනීමට) communicateසියලු වැඩ කිරීමට.
සමහර දුර්ලභ අවස්ථාවන්හිදී, ඔබට සංකීර්ණ, තත්ය කාලීන ප්රතිදානය අල්ලා ගැනීම අවශ්ය විය හැකිය. වර්ටෙක්ගේ පිළිතුරෙන් ඉදිරි මාවතක් යෝජනා කරයි, නමුත් communicateපරිස්සමින් භාවිතා නොකළහොත් හැර වෙනත් ක්රම අවහිර කිරීම් වලට ගොදුරු වේ.
ඉහත සියළු කාර්යයන් මෙන්ම, ආරක්ෂාව ගැන සැලකිලිමත් නොවන විට, සම්මත කිරීමෙන් ඔබට වඩාත් සංකීර්ණ ෂෙල් විධාන ක්රියාත්මක කළ shell=Trueහැකිය.
සටහන්
1. ෂෙල් විධාන ධාවනය කිරීම: shell=Trueතර්කය
සාමාන්යයෙන්, එක් එක් ඇමතුමක් run, check_outputහෝ Popenඉදිකිරීමටත් වූ ඉටු තනි වැඩසටහන . ඒ කියන්නේ විසිතුරු බෑෂ් විලාසිතාවේ පයිප්ප නැහැ. ඔබට සංකීර්ණ ෂෙල් විධාන ක්රියාත්මක කිරීමට අවශ්ය නම්, ඔබට සමත් විය හැකිය shell=True, එම කාර්යයන් තුනම සහාය වේ.
කෙසේ වෙතත්, එසේ කිරීමෙන් ආරක්ෂක ගැටළු මතු වේ. ඔබ සැහැල්ලු ස්ක්රිප්ටින් වලට වඩා වැඩි යමක් කරන්නේ නම්, ඔබට එක් එක් ක්රියාවලිය වෙන වෙනම ඇමතීමට වඩා හොඳ විය හැකි අතර, එක් එක් ප්රතිදානය ආදානය ලෙස ඊළඟට යැවීම වඩා හොඳය.
run(cmd, [stdout=etc...], input=other_output)
හෝ
Popen(cmd, [stdout=etc...]).communicate(other_output)
පයිප්ප කෙලින්ම සම්බන්ධ කිරීමට ඇති පෙළඹවීම ශක්තිමත් ය; එයට විරුද්ධ වන්න. එසේ නැත්නම්, ඔබ ඉඩ ඩෙඩ්ලොක්ස් බලන්න හෝ වැනි hacky දේවල් කරන්න වෙනවා මෙම .
2. යුනිකෝඩ් සලකා බැලීම
check_outputපයිතන් 2 හි නූලක් ලබා දෙයි, නමුත් පයිතන් 3 හි ඇති bytesවස්තුවක් ඔබ දැනටමත් නොමැති නම් යුනිකෝඩ් ගැන ඉගෙන ගැනීමට මොහොතක් ගත කිරීම වටී .