මෙම ප්රශ්නයට පිළිතුර රඳා පවතින්නේ ඔබ භාවිතා කරන පයිතන් අනුවාදය මත ය. සරලම ප්රවේශය නම් 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
වස්තුවක් ඔබ දැනටමත් නොමැති නම් යුනිකෝඩ් ගැන ඉගෙන ගැනීමට මොහොතක් ගත කිරීම වටී .