Quá trình con Python chạy

Một chương trình đang chạy được gọi là một tiến trình. Mỗi quy trình có trạng thái hệ thống riêng, bao gồm bộ nhớ, danh sách các tệp đang mở, bộ đếm chương trình theo dõi lệnh đang được thực thi và ngăn xếp cuộc gọi được sử dụng để giữ các biến cục bộ của hàm

Thông thường, một quy trình thực hiện lần lượt các câu lệnh trong một chuỗi duy nhất của luồng điều khiển, đôi khi được gọi là luồng chính của quy trình. Tại bất kỳ thời điểm nào, chương trình chỉ làm một việc

Một chương trình có thể tạo các quy trình mới bằng cách sử dụng các chức năng thư viện, chẳng hạn như các chức năng được tìm thấy trong os hoặc các mô-đun quy trình con, chẳng hạn như os. fork(), quy trình con. Popen(), v.v. Tuy nhiên, các quy trình này, được gọi là quy trình con, chạy dưới dạng các thực thể hoàn toàn độc lập - mỗi thực thể có trạng thái hệ thống riêng và luồng thực thi chính của chúng

Bởi vì một quy trình con là độc lập, nó thực thi đồng thời với quy trình ban đầu. Nghĩa là, quy trình tạo ra quy trình con có thể tiếp tục làm việc với những thứ khác trong khi quy trình con thực hiện công việc của chính nó ở hậu trường

Mô-đun quy trình con cho phép chúng tôi

  1. sinh ra các quy trình mới
  2. kết nối với các đường ống đầu vào/đầu ra/lỗi của chúng
  3. có được mã trả lại của họ

Nó cung cấp giao diện cấp cao hơn một số mô-đun có sẵn khác và nhằm thay thế các chức năng sau

  1. hệ điều hành. hệ thống()
  2. hệ điều hành. sinh sản *()
  3. hệ điều hành. giáo hoàng*()
  4. giáo hoàng2. *()
  5. mệnh lệnh. *()

Chúng tôi không thể sử dụng các lệnh UNIX trong tập lệnh Python của mình như thể chúng là mã Python. Ví dụ: tên echo gây ra lỗi cú pháp vì echo không phải là câu lệnh hoặc hàm tích hợp trong Python. Vì vậy, trong tập lệnh Python, chúng tôi đang sử dụng tên in thay thế

Để chạy các lệnh UNIX, chúng ta cần tạo một quy trình con chạy lệnh. Cách tiếp cận được đề xuất để gọi các quy trình con là sử dụng các chức năng tiện lợi cho tất cả các trường hợp sử dụng mà chúng có thể xử lý. Hoặc chúng ta có thể sử dụng giao diện Popen cơ bản có thể được sử dụng trực tiếp

Cách đơn giản nhất để chạy lệnh UNIX là sử dụng os. hệ thống()

>>> import os
>>> os.system('echo $HOME')
/user/khong
0

>>> # or we can use
>>> os.system('echo %s' %'$HOME')
/user/khong
0

Đúng như dự đoán, chúng tôi đã nhận được $HOME dưới dạng thiết bị xuất chuẩn (đến thiết bị đầu cuối). Ngoài ra, chúng tôi nhận được giá trị trả về là 0, đây là kết quả của việc thực thi lệnh này, điều đó có nghĩa là không có lỗi trong quá trình thực thi

hệ điều hành. system('command with args') chuyển lệnh và đối số tới trình bao hệ thống của chúng tôi. Bằng cách sử dụng này thực sự có thể chạy nhiều lệnh cùng một lúc và thiết lập các đường ống và chuyển hướng đầu vào/đầu ra.

os.system('command_1 < input_file | command_2 > output_file')

Nếu chúng tôi chạy mã ở trên os. system('echo $HOME') trong Python IDLE, chúng tôi chỉ thấy 0 vì thiết bị xuất chuẩn có nghĩa là thiết bị đầu cuối. Để xem đầu ra lệnh, chúng ta nên chuyển hướng nó đến một tệp và đọc từ đó

>>> import os
>>> os.system('echo $HOME > outfile')
0
>>> f = open('outfile','r')
>>> f.read()
'/user/khong\n'

Mở một đường dẫn đến hoặc từ lệnh. Giá trị trả về là một đối tượng tệp mở được kết nối với đường ống, có thể đọc hoặc ghi tùy thuộc vào chế độ là 'r' (mặc định) hay 'w'. Đối số bufsize có cùng ý nghĩa với đối số tương ứng với hàm open() tích hợp. Trạng thái thoát của lệnh (được mã hóa theo định dạng được chỉ định cho wait()) có sẵn dưới dạng giá trị trả về của phương thức close() của đối tượng tệp, ngoại trừ khi trạng thái thoát bằng 0 (chấm dứt không có lỗi), Không có là

>>> import os
>>> stream = os.popen('echo $HOME')
>>> stream.read()
'/user/khong\n'

hệ điều hành. popen() làm điều tương tự như os. hệ thống ngoại trừ việc nó cung cấp cho chúng tôi một đối tượng luồng giống như tệp mà chúng tôi có thể sử dụng để truy cập đầu vào/đầu ra tiêu chuẩn cho quy trình đó. Có 3 biến thể khác của popen, tất cả đều xử lý i/o hơi khác nhau

Nếu chúng ta chuyển mọi thứ dưới dạng một chuỗi, thì lệnh của chúng ta sẽ được chuyển đến trình bao;

Tuy nhiên, nó không được dùng nữa kể từ phiên bản 2. 6. Chức năng này đã lỗi thời. Sử dụng mô-đun quy trình con.

Về cơ bản, nó giống như lớp Popen và nhận tất cả các đối số giống nhau, nhưng nó chỉ đợi cho đến khi lệnh hoàn thành và cung cấp cho chúng tôi mã trả về

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

Chạy lệnh được mô tả bởi args. Đợi lệnh hoàn thành, sau đó trả về thuộc tính returncode

>>> import os
>>> os.chdir('/')
>>> import subprocess
>>> subprocess.call(['ls','-l'])
total 181
drwxr-xr-x    2 root root  4096 Mar  3  2012 bin
drwxr-xr-x    4 root root  1024 Oct 26  2012 boot
...

Các đối số dòng lệnh được truyền dưới dạng một danh sách các chuỗi, giúp tránh phải thoát dấu ngoặc kép hoặc các ký tự đặc biệt khác mà trình bao có thể hiểu được

>>> import subprocess
>>> subprocess.call('echo $HOME')
Traceback (most recent call last):
...
OSError: [Errno 2] No such file or directory
>>>
>>> subprocess.call('echo $HOME', shell=True)
/user/khong
0

Đặt đối số trình bao thành giá trị thực khiến quy trình con sinh ra quy trình trình bao trung gian và yêu cầu nó chạy lệnh. Nói cách khác, sử dụng trình bao trung gian có nghĩa là các biến, mẫu hình cầu và các tính năng trình bao đặc biệt khác trong chuỗi lệnh được xử lý trước khi lệnh được chạy. Ở đây, trong ví dụ, $HOME đã được xử lý trước lệnh echo. Thực ra đây là trường hợp lệnh mở rộng shell còn lệnh ls -l được coi là lệnh đơn giản

Đây là một mã mẫu (PyGoogle/FFMpeg/iframe_extract. py). Nó tải xuống video YouTube và sau đó trích xuất các khung hình I vào thư mục con

'''
iframe_extract.py - download video and ffmpeg i-frame extraction
Usage: 
(ex) python iframe_extract.py -u https://www.youtube.com/watch?v=dP15zlyra3c
This code does two things:
1. Download using youtube-dl
cmd = ['youtube-dl', '-f', videoSize, '-k', '-o', video_out, download_url]
2. Extract i-frames via ffmpeg
cmd = [ffmpeg,'-i', inFile,'-f', 'image2','-vf',
        "select='eq(pict_type,PICT_TYPE_I)'",'-vsync','vfr', imgFilenames]
'''

from __future__ import unicode_literals
import youtube_dl

import sys
import os
import subprocess
import argparse
import glob

if sys.platform == "Windows":
    FFMPEG_BIN = "ffmpeg.exe"
    MOVE = "move"
    MKDIR = "mkdir"
else:
    FFMPEG_BIN = "ffmpeg"
    MOVE = "mv"
    MKDIR = "md"


def iframe_extract(inFile):
# ffmpeg -i inFile -f image2 -vf \
#   "select='eq(pict_type,PICT_TYPE_I)'" -vsync vfr oString%03d.png

    # infile : video file name 
    #          (ex) 'FoxSnowDive-Yellowstone-BBCTwo.mp4'
    imgPrefix = inFile.split('.')[0]
    # imgPrefix : image file 

    # start extracting i-frames
    home = os.path.expanduser("~")
    ffmpeg = home + '/bin/ffmpeg'

    imgFilenames = imgPrefix + '%03d.png'
  
    cmd = [ffmpeg,'-i', inFile,'-f', 'image2','-vf',
        "select='eq(pict_type,PICT_TYPE_I)'",'-vsync','vfr', imgFilenames]
    
    # create iframes
    print "creating iframes ...."
    subprocess.call(cmd)

    # Move the extracted iframes to a subfolder
    # imgPrefix is used as a subfolder name that stores iframe images
    cmd = 'mkdir -p ' + imgPrefix
    os.system(cmd)
    print "make subdirectoy", cmd
    mvcmd = 'mv ' + imgPrefix + '*.png ' + imgPrefix
    print "moving images to subdirectoy", mvcmd
    os.system(mvcmd)



def get_info_and_download(download_url):

    # Get video meta info and then download using youtube-dl

    ydl_opts = {}

    # get meta info from the video
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        meta = ydl.extract_info(download_url, download=False)

    # renaming the file 
    # remove special characters from the file name
    print('meta[title]=%s' %meta['title'])
    out = ''.join(c for c in meta['title'] if c.isalnum() or c =='-' or c =='_' ) 
    print('out=%s' %out)
    extension = meta['ext']
    video_out = out + '.' + extension
    print('video_out=%s' %video_out)
    videoSize = 'bestvideo[height<=540]+bestaudio/best[height<=540]'
    cmd = ['youtube-dl', '-f', videoSize, '-k', '-o', video_out, download_url]
    print('cmd=%s' %cmd)

    # download the video
    subprocess.call(cmd)

    # Sometimes output file has format code in name such as 'out.f248.webm'
    # so, in this case, we want to rename it 'out.webm' 
    found = False
    extension_list = ['mkv', 'mp4', 'webm']
    for e in extension_list:
       glob_str = '*.' + e
       for f in glob.glob(glob_str):
          if out in f:
             if os.path.isfile(f):
                video_out = f
                found = True
                break
       if found:
          break
       
    # call iframe-extraction : ffmpeg
    print('before iframe_extract() video_out=%s' %video_out)
    iframe_extract(video_out)
    return meta



def check_arg(args=None):

# Command line options
# Currently, only the url option is used

    parser = argparse.ArgumentParser(description='download video')
    parser.add_argument('-u', '--url',
                        help='download url',
                        required='True')
    parser.add_argument('-i', '--infile',
                        help='input to iframe extract')
    parser.add_argument('-o', '--outfile',
                        help='output name for iframe image')

    results = parser.parse_args(args)
    return (results.url,
            results.infile,
            results.outfile)


# Usage sample:
#    syntax: python iframe_extract.py -u url
#    (ex) python iframe_extract.py -u https://www.youtube.com/watch?v=dP15zlyra3c

if __name__ == '__main__':
    u,i,o = check_arg(sys.argv[1:])
    meta = get_info_and_download(u)

Trình duyệt của bạn không hỗ trợ thẻ video

________số 8_______

Hàm check_call() hoạt động giống như hàm call() ngoại trừ mã thoát được kiểm tra và nếu nó báo lỗi xảy ra thì ngoại lệ CalledProcessError sẽ xuất hiện

>>> import subprocess
>>> subprocess.check_call(['false'])
Traceback (most recent call last):
...
subprocess.CalledProcessError: Command '['false']' returned non-zero exit status 1

quy trình con. check_output()

os.system('command_1 < input_file | command_2 > output_file')
0

Các kênh đầu vào và đầu ra tiêu chuẩn cho quá trình bắt đầu bằng lệnh gọi() được liên kết với đầu vào và đầu ra của cha mẹ. Điều đó có nghĩa là chương trình gọi không thể nắm bắt đầu ra của lệnh. Để nắm bắt đầu ra, chúng ta có thể sử dụng check_output() để xử lý sau

os.system('command_1 < input_file | command_2 > output_file')
1

Chức năng này đã được thêm vào Python 2. 7

Việc tạo và quản lý quy trình cơ bản trong mô-đun này được xử lý bởi lớp Popen. Nó cung cấp rất nhiều tính linh hoạt để các nhà phát triển có thể xử lý các trường hợp ít phổ biến hơn không có trong các chức năng tiện lợi

quy trình con. Popen() thực thi một chương trình con trong một tiến trình mới. Trên Unix, lớp sử dụng os. hành vi giống như execvp() để thực thi chương trình con. Trên Windows, lớp sử dụng hàm Windows CreateProcess()

args của quy trình con. Giáo hoàng ()

os.system('command_1 < input_file | command_2 > output_file')
2
  1. tranh luận
    phải là một chuỗi các đối số của chương trình hoặc một chuỗi khác. Theo mặc định, chương trình thực thi là mục đầu tiên trong args nếu args là một chuỗi. Nếu args là một chuỗi, việc giải thích phụ thuộc vào nền tảng. Nên truyền args dưới dạng một chuỗi

  2. vỏ bọc
    đối số trình bao (mặc định là Sai) chỉ định có sử dụng trình bao làm chương trình để thực thi hay không. Nếu shell là True, bạn nên chuyển args dưới dạng chuỗi thay vì dưới dạng chuỗi
    Trên Unix với shell=True, shell mặc định là /bin/sh
    1. Nếu args là một chuỗi, thì chuỗi đó chỉ định lệnh thực thi thông qua trình bao. Điều này có nghĩa là chuỗi phải được định dạng chính xác như khi nhập vào dấu nhắc trình bao. Điều này bao gồm, ví dụ, trích dẫn hoặc dấu gạch chéo ngược tên tệp thoát với dấu cách trong đó
    2. Nếu đối số là một chuỗi, mục đầu tiên chỉ định chuỗi lệnh và bất kỳ mục bổ sung nào sẽ được coi là đối số bổ sung cho chính trình bao. Điều đó có nghĩa là, Popen làm tương đương với.
      os.system('command_1 < input_file | command_2 > output_file')
      
      3

  3. tăng kích thước
    nếu được cung cấp, có cùng ý nghĩa với đối số tương ứng với hàm open() tích hợp
    1. 0 có nghĩa là không có bộ đệm
    2. 1 có nghĩa là dòng đệm
    3. bất kỳ giá trị dương nào khác có nghĩa là sử dụng bộ đệm có kích thước (xấp xỉ) đó
    4. Bufsize âm có nghĩa là sử dụng mặc định của hệ thống, thường có nghĩa là được lưu vào bộ đệm đầy đủ
    5. Giá trị mặc định cho bufsize là 0 (không có bộ đệm)

  4. thực thi được
    chỉ định một chương trình thay thế để thực thi. Nó rất hiếm khi cần thiết

  5. stdin, thiết bị xuất chuẩn và thiết bị xuất chuẩn
    1. chỉ định tương ứng đầu vào tiêu chuẩn, đầu ra tiêu chuẩn và xử lý tệp lỗi tiêu chuẩn của chương trình đã thực hiện
    2. Các giá trị hợp lệ là PIPE, bộ mô tả tệp hiện có (số nguyên dương), đối tượng tệp hiện có và Không có
    3. PIPE chỉ ra rằng một đường ống mới cho con nên được tạo
    4. Với cài đặt mặc định là Không, sẽ không có chuyển hướng nào xảy ra;
    5. Ngoài ra, thiết bị xuất chuẩn có thể là STDOUT, điều này cho biết rằng dữ liệu thiết bị xuất chuẩn từ tiến trình con sẽ được ghi vào cùng một tệp xử lý như đối với thiết bị xuất chuẩn

  6. preexec_fn
    được đặt thành một đối tượng có thể gọi được, đối tượng này sẽ được gọi trong tiến trình con ngay trước khi tiến trình con được thực thi. (Chỉ Unix)

  7. close_fds
    là đúng, tất cả các bộ mô tả tệp ngoại trừ 0, 1 và 2 sẽ bị đóng trước khi tiến trình con được thực thi. (Chỉ Unix). Hoặc, trên Windows, nếu close_fds là true thì sẽ không có xử lý nào được kế thừa bởi tiến trình con. Lưu ý rằng trên Windows, chúng tôi không thể đặt close_fds thành true và cũng chuyển hướng các điều khiển tiêu chuẩn bằng cách đặt stdin, stdout hoặc stderr

  8. cwd
    is not None thư mục hiện tại của đứa trẻ sẽ được thay đổi thành cwd trước khi nó được thực thi. Lưu ý rằng thư mục này không được xem xét khi tìm kiếm tệp thực thi, vì vậy chúng tôi không thể chỉ định đường dẫn của chương trình liên quan đến cwd

  9. env
    không phải là Không, nó phải là ánh xạ xác định các biến môi trường cho quy trình mới;

  10. universal_newlines
    là True, các đối tượng tệp stdout và stderr được mở dưới dạng tệp văn bản ở chế độ dòng mới chung. Các dòng có thể bị kết thúc bởi bất kỳ '\n', quy ước cuối dòng Unix, '\r', quy ước Macintosh cũ hoặc '\r\n', quy ước Windows. Tất cả các biểu diễn bên ngoài này được chương trình Python xem là '\n'

  11. thông tin khởi động
    sẽ là một đối tượng STARTUPINFO, được chuyển đến hàm CreateProcess bên dưới

  12. cờ sáng tạo
    có thể là CREATE_NEW_CONSOLE hoặc CREATE_NEW_PROCESS_GROUP. (Chỉ dành cho Windows)

hệ điều hành. giáo hoàng vs. quy trình con. Giáo hoàng ()

Điều này được dự định là một sự thay thế cho hệ điều hành. popen, nhưng nó phức tạp hơn. Ví dụ, chúng tôi sử dụng

os.system('command_1 < input_file | command_2 > output_file')
4thay vì
os.system('command_1 < input_file | command_2 > output_file')
5

Nhưng nó toàn diện và có tất cả các tùy chọn trong một lớp thống nhất thay vì các hệ điều hành khác nhau. chức năng popen

quy trình con. Popen() - thiết bị xuất chuẩn và thiết bị xuất chuẩn

os.system('command_1 < input_file | command_2 > output_file')
6

Lưu ý rằng phương thức giao tiếp () trả về một bộ dữ liệu (stdoutdata, stderrdata). ('"Chào thế giới. "\n' ,Không có). Nếu chúng tôi không bao gồm stdout=sub process. PIPE hoặc stderr=quy trình con. PIPE trong cuộc gọi Popen, chúng tôi sẽ chỉ lấy lại Không

os.system('command_1 < input_file | command_2 > output_file')
7Giáo hoàng. giao tiếp () tương tác với quá trình. Gửi dữ liệu đến stdin. Đọc dữ liệu từ thiết bị xuất chuẩn và thiết bị xuất chuẩn, cho đến khi đạt đến cuối tệp. Đợi quá trình kết thúc. Đối số đầu vào tùy chọn phải là một chuỗi được gửi đến tiến trình con hoặc Không, nếu không có dữ liệu nào được gửi đến tiến trình con

Vì vậy, trên thực tế, chúng ta có thể đã làm như dưới đây

os.system('command_1 < input_file | command_2 > output_file')
8

hoặc chúng tôi có thể chỉ định rõ ràng cái nào chúng tôi muốn từ proc. giao tiếp()

os.system('command_1 < input_file | command_2 > output_file')
9

Mã đơn giản nhất cho ví dụ trên có thể gửi luồng trực tiếp tới bảng điều khiển

>>> import os
>>> os.system('echo $HOME > outfile')
0
>>> f = open('outfile','r')
>>> f.read()
'/user/khong\n'
0

Đoạn mã dưới đây là để kiểm tra hành vi thiết bị xuất chuẩn và thiết bị xuất chuẩn

>>> import os
>>> os.system('echo $HOME > outfile')
0
>>> f = open('outfile','r')
>>> f.read()
'/user/khong\n'
1

Nếu chúng ta chạy nó

>>> import os
>>> os.system('echo $HOME > outfile')
0
>>> f = open('outfile','r')
>>> f.read()
'/user/khong\n'
2

Lưu ý rằng thông báo tới thiết bị xuất chuẩn được hiển thị khi nó được tạo nhưng thông báo tới thiết bị xuất chuẩn được đọc qua đường ống. Điều này là do chúng tôi chỉ thiết lập một đường ống dẫn đến thiết bị xuất chuẩn

Sau đó, hãy làm cho cả thiết bị xuất chuẩn và thiết bị xuất chuẩn được truy cập từ Python

>>> import os
>>> os.system('echo $HOME > outfile')
0
>>> f = open('outfile','r')
>>> f.read()
'/user/khong\n'
3

Phương thức giao tiếp () chỉ đọc dữ liệu từ thiết bị xuất chuẩn và thiết bị xuất chuẩn, cho đến khi đạt đến cuối tệp. Vì vậy, sau khi tất cả các tin nhắn đã được in, nếu chúng ta gọi lại giao tiếp(), chúng ta sẽ gặp lỗi

>>> import os
>>> os.system('echo $HOME > outfile')
0
>>> f = open('outfile','r')
>>> f.read()
'/user/khong\n'
4

Nếu chúng tôi muốn các thông báo đến stderr được chuyển đến stderr, chúng tôi sẽ thực hiện. stderr=tiến trình con. STDOUT

>>> import os
>>> os.system('echo $HOME > outfile')
0
>>> f = open('outfile','r')
>>> f.read()
'/user/khong\n'
5

Như chúng ta thấy từ đầu ra, chúng ta không có thiết bị lỗi chuẩn vì nó đã được chuyển hướng đến thiết bị lỗi chuẩn

quy trình con. Popen() - tiêu chuẩn

Ghi vào một quy trình có thể được thực hiện theo cách rất giống nhau. Nếu chúng ta muốn gửi dữ liệu đến stdin của process, chúng ta cần tạo đối tượng Popen với stdin=sub process. ĐƯỜNG ỐNG

Để kiểm tra, hãy viết một chương trình khác (write_to_stdin. py) chỉ cần in Đã nhận. và sau đó lặp lại tin nhắn chúng tôi gửi

>>> import os
>>> os.system('echo $HOME > outfile')
0
>>> f = open('outfile','r')
>>> f.read()
'/user/khong\n'
6

Để gửi tin nhắn đến stdin, chúng ta chuyển chuỗi mà chúng ta muốn gửi làm đối số đầu vào cho giao tiếp()

>>> import os
>>> os.system('echo $HOME > outfile')
0
>>> f = open('outfile','r')
>>> f.read()
'/user/khong\n'
7

Lưu ý rằng thông báo được tạo trong write_to_stdin. quá trình py được in ra thiết bị xuất chuẩn và sau đó giá trị trả về (Không, Không) được in. Đó là bởi vì không có đường ống nào được thiết lập thành thiết bị xuất chuẩn hoặc thiết bị xuất chuẩn

Đây là một đầu ra khác sau khi chúng tôi chỉ định stdout=sub process. PIPE và stderr=quy trình con. PIPE như trước đây để thiết lập đường ống

>>> import os
>>> os.system('echo $HOME > outfile')
0
>>> f = open('outfile','r')
>>> f.read()
'/user/khong\n'
8

quy trình con. Popen() - đường ống vỏ

>>> import os
>>> os.system('echo $HOME > outfile')
0
>>> f = open('outfile','r')
>>> f.read()
'/user/khong\n'
9

các p1. tiêu chuẩn. close() sau khi bắt đầu p2 là điều quan trọng để p1 nhận được SIGPIPE nếu p2 thoát trước p1

Đây là một ví dụ khác cho một lệnh đường ống. Mã lấy ID cửa sổ cho cửa sổ hiện đang hoạt động. Lệnh trông như thế này

>>> import os
>>> stream = os.popen('echo $HOME')
>>> stream.read()
'/user/khong\n'
0

Mã Python

>>> import os
>>> stream = os.popen('echo $HOME')
>>> stream.read()
'/user/khong\n'
1

đầu ra

>>> import os
>>> stream = os.popen('echo $HOME')
>>> stream.read()
'/user/khong\n'
2

quy trình con. Popen() - shell=True

Tránh shell=True bằng mọi cách

shell=True có nghĩa là thực thi mã thông qua trình bao. Nói cách khác, thực thi các chương trình thông qua trình bao có nghĩa là tất cả đầu vào của người dùng được chuyển đến chương trình được diễn giải theo cú pháp và quy tắc ngữ nghĩa của trình bao được gọi. Tốt nhất, điều này chỉ gây bất tiện cho người dùng, bởi vì người dùng phải tuân theo các quy tắc này. Chẳng hạn, các đường dẫn chứa các ký tự shell đặc biệt như dấu ngoặc kép hoặc khoảng trống phải được thoát. Tệ nhất, nó gây rò rỉ bảo mật, vì người dùng có thể thực thi các chương trình tùy ý

shell=True đôi khi thuận tiện để sử dụng các tính năng shell cụ thể như tách từ hoặc mở rộng tham số. Tuy nhiên, nếu một tính năng như vậy được yêu cầu, hãy sử dụng các mô-đun khác được cung cấp cho bạn (e. g. hệ điều hành. đường dẫn. expandvars() để mở rộng tham số hoặc shlex để tách từ). Điều này có nghĩa là nhiều công việc hơn, nhưng tránh được các vấn đề khác. - từ Ý nghĩa thực tế của 'shell=True' trong quy trình con

Nếu args là một chuỗi, thì chuỗi đó chỉ định lệnh thực thi thông qua trình bao. Điều này có nghĩa là chuỗi phải được định dạng chính xác như khi nhập vào dấu nhắc trình bao. Điều này bao gồm, ví dụ, trích dẫn hoặc dấu gạch chéo ngược tên tệp thoát với dấu cách trong đó

>>> import os
>>> stream = os.popen('echo $HOME')
>>> stream.read()
'/user/khong\n'
3

Chuỗi được định dạng chính xác như nó sẽ được nhập tại dấu nhắc trình bao

>>> import os
>>> stream = os.popen('echo $HOME')
>>> stream.read()
'/user/khong\n'
4

Vì vậy, những điều sau đây sẽ không hoạt động

>>> import os
>>> stream = os.popen('echo $HOME')
>>> stream.read()
'/user/khong\n'
5

Làm theo cũng không được

>>> import os
>>> stream = os.popen('echo $HOME')
>>> stream.read()
'/user/khong\n'
6

Đó là bởi vì chúng ta vẫn chuyển nó dưới dạng một chuỗi, Python giả sử toàn bộ chuỗi là tên của chương trình sẽ thực thi và không có chương trình nào gọi là echo "Xin chào thế giới. " vậy là thất bại. Thay vào đó, chúng ta phải chuyển từng đối số riêng biệt

Quy trình con hoạt động như thế nào trong Python?

Hàm call() của quy trình con Python trả về mã đã thực thi của chương trình . Nếu không có đầu ra chương trình, hàm sẽ trả về đoạn mã mà nó đã thực hiện thành công. Nó cũng có thể gây ra ngoại lệ CalledProcessError.

Sự khác biệt giữa cuộc gọi quy trình con và chạy là gì?

Tôi có thể nói rằng bạn sử dụng quy trình con. call() khi bạn muốn chương trình chờ quá trình hoàn tất trước khi chuyển sang quá trình tiếp theo. Trong trường hợp quy trình con. run() , chương trình sẽ cố gắng chạy tất cả các quy trình cùng một lúc, chắc chắn sẽ khiến chương trình bị sập

Đâu là sự khác biệt giữa Popenvà run?

run() thực thi một lệnh và đợi nó kết thúc, trong khi với quy trình con. Popen, bạn có thể tiếp tục thực hiện công việc của mình trong khi quá trình kết thúc và sau đó chỉ cần gọi Popen liên tục . giao tiếp () để chuyển và nhận dữ liệu cho quy trình của bạn.

Làm cách nào để chạy tập lệnh Python từ tập lệnh Python khác bằng quy trình con?

Để thực thi mã Python khác, các đối số phải chứa đường dẫn đến tệp thực thi Python và tới tập lệnh Python . Bên trong args chúng ta có những điều sau đây. "/ usr/cục bộ/bin/trăn". đường dẫn đến tệp thực thi Python cục bộ. "-c". thẻ Python cho phép người dùng viết mã Python dưới dạng văn bản vào dòng lệnh.