- Notifications
You must be signed in to change notification settings - Fork 80
/
Copy pathasyncio-subprocess.po
625 lines (544 loc) · 24.5 KB
/
asyncio-subprocess.po
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2001-2025, Python Software Foundation
# This file is distributed under the same license as the Python package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Rafael Fontenelle <rffontenelle@gmail.com>, 2025
#
#,fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Python 3.12\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-03-21 14:55+0000\n"
"PO-Revision-Date: 2024-05-11 00:33+0000\n"
"Last-Translator: Rafael Fontenelle <rffontenelle@gmail.com>, 2025\n"
"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#:../../library/asyncio-subprocess.rst:7
msgid"Subprocesses"
msgstr"子进程集"
#:../../library/asyncio-subprocess.rst:9
msgid""
"**Source code:** :source:`Lib/asyncio/subprocess.py`, "
":source:`Lib/asyncio/base_subprocess.py`"
msgstr""
"**源代码:** :source:`Lib/asyncio/subprocess.py`, "
":source:`Lib/asyncio/base_subprocess.py`"
#:../../library/asyncio-subprocess.rst:14
msgid""
"This section describes high-level async/await asyncio APIs to create and "
"manage subprocesses."
msgstr"本节介绍了用于创建和管理子进程的高层级 async/await asyncio API。"
#:../../library/asyncio-subprocess.rst:19
msgid""
"Here's an example of how asyncio can run a shell command and obtain its "
"result::"
msgstr"下面的例子演示了如何用 asyncio 运行一个 shell 命令并获取其结果::"
#:../../library/asyncio-subprocess.rst:22
msgid""
"import asyncio\n"
"\n"
"async def run(cmd):\n"
" proc = await asyncio.create_subprocess_shell(\n"
" cmd,\n"
" stdout=asyncio.subprocess.PIPE,\n"
" stderr=asyncio.subprocess.PIPE)\n"
"\n"
" stdout, stderr = await proc.communicate()\n"
"\n"
" print(f'[{cmd!r} exited with {proc.returncode}]')\n"
" if stdout:\n"
" print(f'[stdout]\\n{stdout.decode()}')\n"
" if stderr:\n"
" print(f'[stderr]\\n{stderr.decode()}')\n"
"\n"
"asyncio.run(run('ls /zzz'))"
msgstr""
"import asyncio\n"
"\n"
"async def run(cmd):\n"
" proc = await asyncio.create_subprocess_shell(\n"
" cmd,\n"
" stdout=asyncio.subprocess.PIPE,\n"
" stderr=asyncio.subprocess.PIPE)\n"
"\n"
" stdout, stderr = await proc.communicate()\n"
"\n"
" print(f'[{cmd!r} exited with {proc.returncode}]')\n"
" if stdout:\n"
" print(f'[stdout]\\n{stdout.decode()}')\n"
" if stderr:\n"
" print(f'[stderr]\\n{stderr.decode()}')\n"
"\n"
"asyncio.run(run('ls /zzz'))"
#:../../library/asyncio-subprocess.rst:40
msgid"will print::"
msgstr"将打印::"
#:../../library/asyncio-subprocess.rst:42
msgid""
"['ls /zzz' exited with 1]\n"
"[stderr]\n"
"ls: /zzz: No such file or directory"
msgstr""
"['ls /zzz' exited with 1]\n"
"[stderr]\n"
"ls: /zzz: No such file or directory"
#:../../library/asyncio-subprocess.rst:46
msgid""
"Because all asyncio subprocess functions are asynchronous and asyncio "
"provides many tools to work with such functions, it is easy to execute and "
"monitor multiple subprocesses in parallel. It is indeed trivial to modify "
"the above example to run several commands simultaneously::"
msgstr""
"由于所有 asyncio 子进程函数都是异步的并且 asyncio 提供了许多工具用来配合这些函数使用,因此并行地执行和监视多个子进程十分容易。 "
"要修改上面的例子来同时运行多个命令确实是非常简单的::"
#:../../library/asyncio-subprocess.rst:51
msgid""
"async def main():\n"
" await asyncio.gather(\n"
" run('ls /zzz'),\n"
" run('sleep 1; echo \"hello\"'))\n"
"\n"
"asyncio.run(main())"
msgstr""
"async def main():\n"
" await asyncio.gather(\n"
" run('ls /zzz'),\n"
" run('sleep 1; echo \"hello\"'))\n"
"\n"
"asyncio.run(main())"
#:../../library/asyncio-subprocess.rst:58
msgid"See also the `Examples`_ subsection."
msgstr"另请参阅 `Examples`_ 小节。"
#:../../library/asyncio-subprocess.rst:62
msgid"Creating Subprocesses"
msgstr"创建子进程"
#:../../library/asyncio-subprocess.rst:68
msgid"Create a subprocess."
msgstr"创建一个子进程。"
#:../../library/asyncio-subprocess.rst:70
#:../../library/asyncio-subprocess.rst:89
msgid""
"The *limit* argument sets the buffer limit for :class:`StreamReader` "
"wrappers for :attr:`~asyncio.subprocess.Process.stdout` and "
":attr:`~asyncio.subprocess.Process.stderr` (if :const:`subprocess.PIPE` is "
"passed to *stdout* and *stderr* arguments)."
msgstr""
"*limit* 参数为 :attr:`~asyncio.subprocess.Process.stdout` 和 "
":attr:`~asyncio.subprocess.Process.stderr` 设置 :class:`StreamReader` "
"包装器的缓冲区上限(如果将 :const:`subprocess.PIPE` 传给 *stdout* 和 *stderr* 参数)。"
#:../../library/asyncio-subprocess.rst:74
#:../../library/asyncio-subprocess.rst:93
msgid"Return a :class:`~asyncio.subprocess.Process` instance."
msgstr"返回一个 :class:`~asyncio.subprocess.Process` 实例。"
#:../../library/asyncio-subprocess.rst:76
msgid""
"See the documentation of :meth:`loop.subprocess_exec` for other parameters."
msgstr"有关其他形参的说明请查阅 :meth:`loop.subprocess_exec` 的文档。"
#:../../library/asyncio-subprocess.rst:79
#:../../library/asyncio-subprocess.rst:107
msgid"Removed the *loop* parameter."
msgstr"移除了 *loop* 形参。"
#:../../library/asyncio-subprocess.rst:87
msgid"Run the *cmd* shell command."
msgstr"运行 *cmd* shell 命令。"
#:../../library/asyncio-subprocess.rst:95
msgid""
"See the documentation of :meth:`loop.subprocess_shell` for other parameters."
msgstr"有关其他形参的说明请查阅 :meth:`loop.subprocess_shell` 的文档。"
#:../../library/asyncio-subprocess.rst:100
msgid""
"It is the application's responsibility to ensure that all whitespace and "
"special characters are quoted appropriately to avoid `shell injection "
"<https://en.wikipedia.org/wiki/Shell_injection#Shell_injection>`_ "
"vulnerabilities. The :func:`shlex.quote` function can be used to properly "
"escape whitespace and special shell characters in strings that are going to "
"be used to construct shell commands."
msgstr""
"应用程序要负责确保正确地转义所有空白字符和特殊字符以防止 `shell 注入 "
"<https://en.wikipedia.org/wiki/Shell_injection#Shell_injection>`_ 漏洞。 "
":func:`shlex.quote` 函数可以被用来正确地转义字符串中可以被用来构造 shell 命令的空白字符和特殊 shell 字符。"
#:../../library/asyncio-subprocess.rst:112
msgid""
"Subprocesses are available for Windows if a :class:`ProactorEventLoop` is "
"used. See :ref:`Subprocess Support on Windows <asyncio-windows-subprocess>` "
"for details."
msgstr""
"如果使用了 :class:`ProactorEventLoop` 则子进程将在 Windows 中可用。 详情参见 :ref:`Windows "
"上的子进程支持 <asyncio-windows-subprocess>`。"
#:../../library/asyncio-subprocess.rst:118
msgid""
"asyncio also has the following *low-level* APIs to work with subprocesses: "
":meth:`loop.subprocess_exec`, :meth:`loop.subprocess_shell`, "
":meth:`loop.connect_read_pipe`, :meth:`loop.connect_write_pipe`, as well as "
"the :ref:`Subprocess Transports <asyncio-subprocess-transports>` and "
":ref:`Subprocess Protocols <asyncio-subprocess-protocols>`."
msgstr""
"asyncio 还有下列 *低层级* API 可配合子进程使用: :meth:`loop.subprocess_exec`, "
":meth:`loop.subprocess_shell`, :meth:`loop.connect_read_pipe`, "
":meth:`loop.connect_write_pipe` 以及 :ref:`子进程传输 <asyncio-subprocess-"
"transports>` 和 :ref:`子进程协议 <asyncio-subprocess-protocols>`。"
#:../../library/asyncio-subprocess.rst:126
msgid"Constants"
msgstr"常量"
#:../../library/asyncio-subprocess.rst:131
msgid"Can be passed to the *stdin*, *stdout* or *stderr* parameters."
msgstr"可以被传递给 *stdin*, *stdout* 或 *stderr* 形参。"
#:../../library/asyncio-subprocess.rst:133
msgid""
"If *PIPE* is passed to *stdin* argument, the :attr:`Process.stdin "
"<asyncio.subprocess.Process.stdin>` attribute will point to a "
":class:`~asyncio.StreamWriter` instance."
msgstr""
"如果将 *PIPE* 传给 *stdin* 参数,则 :attr:`Process.stdin "
"<asyncio.subprocess.Process.stdin>` 属性将指向一个 :class:`~asyncio.StreamWriter` "
"实例。"
#:../../library/asyncio-subprocess.rst:137
msgid""
"If *PIPE* is passed to *stdout* or *stderr* arguments, the "
":attr:`Process.stdout <asyncio.subprocess.Process.stdout>` and "
":attr:`Process.stderr <asyncio.subprocess.Process.stderr>` attributes will "
"point to :class:`~asyncio.StreamReader` instances."
msgstr""
"如果将 *PIPE* 传给 *stdout* 或 *stderr* 参数,则 :attr:`Process.stdout "
"<asyncio.subprocess.Process.stdout>` 和 :attr:`Process.stderr "
"<asyncio.subprocess.Process.stderr>` 属性将指向 :class:`~asyncio.StreamReader` "
"实例。"
#:../../library/asyncio-subprocess.rst:145
msgid""
"Special value that can be used as the *stderr* argument and indicates that "
"standard error should be redirected into standard output."
msgstr"可以用作 *stderr* 参数的特殊值,表示标准错误应当被重定向到标准输出。"
#:../../library/asyncio-subprocess.rst:151
msgid""
"Special value that can be used as the *stdin*, *stdout* or *stderr* argument"
" to process creation functions. It indicates that the special file "
":data:`os.devnull` will be used for the corresponding subprocess stream."
msgstr""
"可以用作 *stdin*, *stdout* 或 *stderr* 参数来处理创建函数的特殊值。 它表示将为相应的子进程流使用特殊文件 "
":data:`os.devnull`。"
#:../../library/asyncio-subprocess.rst:157
msgid"Interacting with Subprocesses"
msgstr"与子进程交互"
#:../../library/asyncio-subprocess.rst:159
msgid""
"Both :func:`create_subprocess_exec` and :func:`create_subprocess_shell` "
"functions return instances of the *Process* class. *Process* is a high-"
"level wrapper that allows communicating with subprocesses and watching for "
"their completion."
msgstr""
":func:`create_subprocess_exec` 和 :func:`create_subprocess_shell` 函数都返回 "
"*Process* 类的实例。 *Process* 是一个高层级包装器,它允许与子进程通信并监视其完成情况。"
#:../../library/asyncio-subprocess.rst:167
msgid""
"An object that wraps OS processes created by the "
":func:`~asyncio.create_subprocess_exec` and "
":func:`~asyncio.create_subprocess_shell` functions."
msgstr""
"一个用于包装由 :func:`~asyncio.create_subprocess_exec` 和 "
":func:`~asyncio.create_subprocess_shell` 函数创建的 OS 进程的对象。"
#:../../library/asyncio-subprocess.rst:171
msgid""
"This class is designed to have a similar API to the "
":class:`subprocess.Popen` class, but there are some notable differences:"
msgstr"这个类被设计为具有与 :class:`subprocess.Popen` 类相似的 API,但两者有一些重要的差异:"
#:../../library/asyncio-subprocess.rst:175
msgid""
"unlike Popen, Process instances do not have an equivalent to the "
":meth:`~subprocess.Popen.poll` method;"
msgstr"不同于 Popen,Process 实例没有与 :meth:`~subprocess.Popen.poll` 方法等价的方法;"
#:../../library/asyncio-subprocess.rst:178
msgid""
"the :meth:`~asyncio.subprocess.Process.communicate` and "
":meth:`~asyncio.subprocess.Process.wait` methods don't have a *timeout* "
"parameter: use the :func:`~asyncio.wait_for` function;"
msgstr""
":meth:`~asyncio.subprocess.Process.communicate` 和 "
":meth:`~asyncio.subprocess.Process.wait` 方法没有 *timeout* 形参:请使用 "
":func:`~asyncio.wait_for` 函数;"
#:../../library/asyncio-subprocess.rst:182
msgid""
"the :meth:`Process.wait() <asyncio.subprocess.Process.wait>` method is "
"asynchronous, whereas :meth:`subprocess.Popen.wait` method is implemented as"
" a blocking busy loop;"
msgstr""
":meth:`Process.wait() <asyncio.subprocess.Process.wait>` 方法是异步的,而 "
":meth:`subprocess.Popen.wait` 方法则被实现为阻塞型忙循环;"
#:../../library/asyncio-subprocess.rst:186
msgid"the *universal_newlines* parameter is not supported."
msgstr"*universal_newlines* 形参不被支持。"
#:../../library/asyncio-subprocess.rst:188
msgid"This class is :ref:`not thread safe <asyncio-multithreading>`."
msgstr"这个类不是线程安全的(:ref:`not thread safe <asyncio-multithreading>`)。"
#:../../library/asyncio-subprocess.rst:190
msgid""
"See also the :ref:`Subprocess and Threads <asyncio-subprocess-threads>` "
"section."
msgstr"请参阅 :ref:`子进程和线程 <asyncio-subprocess-threads>` 部分。"
#:../../library/asyncio-subprocess.rst:196
msgid"Wait for the child process to terminate."
msgstr"等待子进程终结。"
#:../../library/asyncio-subprocess.rst:198
msgid"Set and return the :attr:`returncode` attribute."
msgstr"设置并返回 :attr:`returncode` 属性。"
#:../../library/asyncio-subprocess.rst:202
msgid""
"This method can deadlock when using ``stdout=PIPE`` or ``stderr=PIPE`` and "
"the child process generates so much output that it blocks waiting for the OS"
" pipe buffer to accept more data. Use the :meth:`communicate` method when "
"using pipes to avoid this condition."
msgstr""
"当使用 ``stdout=PIPE`` 或 ``stderr=PIPE`` 并且子进程产生了足以阻塞 OS "
"管道缓冲区等待接收更多的数据的输出时,此方法会发生死锁。 当使用管道时请使用 :meth:`communicate` 方法来避免这种情况。"
#:../../library/asyncio-subprocess.rst:211
msgid"Interact with process:"
msgstr"与进程交互:"
#:../../library/asyncio-subprocess.rst:213
msgid"send data to *stdin* (if *input* is not ``None``);"
msgstr"发送数据到 *stdin* (如果 *input* 不为 ``None``);"
#:../../library/asyncio-subprocess.rst:214
msgid"closes *stdin*;"
msgstr"关闭 *stdin*;"
#:../../library/asyncio-subprocess.rst:215
msgid"read data from *stdout* and *stderr*, until EOF is reached;"
msgstr"从 *stdout* 和 *stderr* 读取数据,直至到达 EOF;"
#:../../library/asyncio-subprocess.rst:216
msgid"wait for process to terminate."
msgstr"等待进程终结。"
#:../../library/asyncio-subprocess.rst:218
msgid""
"The optional *input* argument is the data (:class:`bytes` object) that will "
"be sent to the child process."
msgstr"可选的 *input* 参数为将被发送到子进程的数据 (:class:`bytes` 对象)。"
#:../../library/asyncio-subprocess.rst:221
msgid"Return a tuple ``(stdout_data, stderr_data)``."
msgstr"返回一个元组 ``(stdout_data, stderr_data)``。"
#:../../library/asyncio-subprocess.rst:223
msgid""
"If either :exc:`BrokenPipeError` or :exc:`ConnectionResetError` exception is"
" raised when writing *input* into *stdin*, the exception is ignored. This "
"condition occurs when the process exits before all data are written into "
"*stdin*."
msgstr""
"如果在将 *input* 写入到 *stdin* 时引发了 :exc:`BrokenPipeError` 或 "
":exc:`ConnectionResetError` 异常,异常会被忽略。 此条件会在进程先于所有数据被写入到 *stdin* 之前退出时发生。"
#:../../library/asyncio-subprocess.rst:228
msgid""
"If it is desired to send data to the process' *stdin*, the process needs to "
"be created with ``stdin=PIPE``. Similarly, to get anything other than "
"``None`` in the result tuple, the process has to be created with "
"``stdout=PIPE`` and/or ``stderr=PIPE`` arguments."
msgstr""
"如果想要将数据发送到进程的 *stdin*,则创建进程时必须使用 ``stdin=PIPE``。 类似地,要在结果元组中获得任何不为 ``None`` "
"的值,则创建进程时必须使用 ``stdout=PIPE`` 和/或 ``stderr=PIPE`` 参数。"
#:../../library/asyncio-subprocess.rst:234
msgid""
"Note, that the data read is buffered in memory, so do not use this method if"
" the data size is large or unlimited."
msgstr"注意,数据读取在内存中是带缓冲的,因此如果数据量过大或不受则不要使用此方法。"
#:../../library/asyncio-subprocess.rst:239
msgid"*stdin* gets closed when ``input=None`` too."
msgstr"*stdin* 在 `input=None` 时也会被关闭。"
#:../../library/asyncio-subprocess.rst:243
msgid"Sends the signal *signal* to the child process."
msgstr"将信号 *signal* 发送给子进程。"
#:../../library/asyncio-subprocess.rst:247
msgid""
"On Windows, :py:const:`~signal.SIGTERM` is an alias for :meth:`terminate`. "
"``CTRL_C_EVENT`` and ``CTRL_BREAK_EVENT`` can be sent to processes started "
"with a *creationflags* parameter which includes "
"``CREATE_NEW_PROCESS_GROUP``."
msgstr""
"在 Windows 上,:py:const:`~signal.SIGTERM` 是 :meth:`terminate` 的别名。 "
"``CTRL_C_EVENT`` 和 ``CTRL_BREAK_EVENT`` 可被发送给启动时带有 *creationflags* 形参且其中包括 "
"``CREATE_NEW_PROCESS_GROUP`` 的进程。"
#:../../library/asyncio-subprocess.rst:254
msgid"Stop the child process."
msgstr"停止子进程。"
#:../../library/asyncio-subprocess.rst:256
msgid""
"On POSIX systems this method sends :py:const:`~signal.SIGTERM` to the child "
"process."
msgstr"在 POSIX 系统上此方法会发送 :py:const:`~signal.SIGTERM` 给子进程。"
#:../../library/asyncio-subprocess.rst:259
msgid""
"On Windows the Win32 API function :c:func:`!TerminateProcess` is called to "
"stop the child process."
msgstr"在 Windows 上会调用 Win32 API 函数 :c:func:`!TerminateProcess` 来停止子进程。"
#:../../library/asyncio-subprocess.rst:264
msgid"Kill the child process."
msgstr"杀掉子进程。"
#:../../library/asyncio-subprocess.rst:266
msgid""
"On POSIX systems this method sends :py:data:`~signal.SIGKILL` to the child "
"process."
msgstr"在 POSIX 系统中此方法会发送 :py:data:`~signal.SIGKILL` 给子进程。"
#:../../library/asyncio-subprocess.rst:269
msgid"On Windows this method is an alias for :meth:`terminate`."
msgstr"在 Windows 上此方法是 :meth:`terminate` 的别名。"
#:../../library/asyncio-subprocess.rst:273
msgid""
"Standard input stream (:class:`~asyncio.StreamWriter`) or ``None`` if the "
"process was created with ``stdin=None``."
msgstr""
"标准输入流 (:class:`~asyncio.StreamWriter`) 或者如果进程创建时设置了 ``stdin=None`` 则为 "
"``None``。"
#:../../library/asyncio-subprocess.rst:278
msgid""
"Standard output stream (:class:`~asyncio.StreamReader`) or ``None`` if the "
"process was created with ``stdout=None``."
msgstr""
"标准输出流 (:class:`~asyncio.StreamReader`) 或者如果进程创建时设置了 ``stdout=None`` 则为 "
"``None``。"
#:../../library/asyncio-subprocess.rst:283
msgid""
"Standard error stream (:class:`~asyncio.StreamReader`) or ``None`` if the "
"process was created with ``stderr=None``."
msgstr""
"标准错误流 (:class:`~asyncio.StreamReader`) 或者如果进程创建时设置了 ``stderr=None`` 则为 "
"``None``。"
#:../../library/asyncio-subprocess.rst:288
msgid""
"Use the :meth:`communicate` method rather than :attr:`process.stdin.write() "
"<stdin>`, :attr:`await process.stdout.read() <stdout>` or :attr:`await "
"process.stderr.read() <stderr>`. This avoids deadlocks due to streams "
"pausing reading or writing and blocking the child process."
msgstr""
"使用 :meth:`communicate` 方法而非 :attr:`process.stdin.write() <stdin>`, "
":attr:`await process.stdout.read() <stdout>` 或 :attr:`await "
"process.stderr.read() <stderr>`。 这可以避免由于流暂停读取或写入并阻塞子进程而导致的死锁。"
#:../../library/asyncio-subprocess.rst:297
msgid"Process identification number (PID)."
msgstr"进程标识号(PID)。"
#:../../library/asyncio-subprocess.rst:299
msgid""
"Note that for processes created by the "
":func:`~asyncio.create_subprocess_shell` function, this attribute is the PID"
" of the spawned shell."
msgstr""
"请注意对于由 :func:`~asyncio.create_subprocess_shell` 函数所创建的进程,这个属性将是所生成的 shell 的 "
"PID。"
#:../../library/asyncio-subprocess.rst:304
msgid"Return code of the process when it exits."
msgstr"当进程退出时返回其代号。"
#:../../library/asyncio-subprocess.rst:306
msgid"A ``None`` value indicates that the process has not terminated yet."
msgstr"``None`` 值表示进程尚未终止。"
#:../../library/asyncio-subprocess.rst:308
msgid""
"A negative value ``-N`` indicates that the child was terminated by signal "
"``N`` (POSIX only)."
msgstr"一个负值 ``-N`` 表示子进程被信号 ``N`` 中断 (仅 POSIX)."
#:../../library/asyncio-subprocess.rst:315
msgid"Subprocess and Threads"
msgstr"子进程和线程"
#:../../library/asyncio-subprocess.rst:317
msgid""
"Standard asyncio event loop supports running subprocesses from different "
"threads by default."
msgstr"标准 asyncio 事件循环默认支持从不同线程中运行子进程。"
#:../../library/asyncio-subprocess.rst:320
msgid""
"On Windows subprocesses are provided by :class:`ProactorEventLoop` only "
"(default), :class:`SelectorEventLoop` has no subprocess support."
msgstr""
"在 Windows 上子进程(默认)只由 :class:`ProactorEventLoop` "
"提供,:class:`SelectorEventLoop` 没有子进程支持。"
#:../../library/asyncio-subprocess.rst:323
msgid""
"On UNIX *child watchers* are used for subprocess finish waiting, see "
":ref:`asyncio-watchers` for more info."
msgstr"在 UNIX 上会使用 *child watchers* 来让子进程结束等待,详情请参阅 :ref:`asyncio-watchers`。"
#:../../library/asyncio-subprocess.rst:329
msgid""
"UNIX switched to use :class:`ThreadedChildWatcher` for spawning subprocesses"
" from different threads without any limitation."
msgstr"UNIX 对于从不同线程中无限制地生成子进程会切换为使用 :class:`ThreadedChildWatcher`。"
#:../../library/asyncio-subprocess.rst:332
msgid""
"Spawning a subprocess with *inactive* current child watcher raises "
":exc:`RuntimeError`."
msgstr"使用 *不活动的* 当前子监视器生成子进程将引发 :exc:`RuntimeError`。"
#:../../library/asyncio-subprocess.rst:335
msgid""
"Note that alternative event loop implementations might have own limitations;"
" please refer to their documentation."
msgstr"请注意其他的事件循环实现可能有其本身的限制;请查看它们各自的文档。"
#:../../library/asyncio-subprocess.rst:340
msgid""
"The :ref:`Concurrency and multithreading in asyncio <asyncio-"
"multithreading>` section."
msgstr":ref:`asyncio 中的并发和多线程 <asyncio-multithreading>` 章节。"
#:../../library/asyncio-subprocess.rst:345
msgid"Examples"
msgstr"例子"
#:../../library/asyncio-subprocess.rst:347
msgid""
"An example using the :class:`~asyncio.subprocess.Process` class to control a"
" subprocess and the :class:`StreamReader` class to read from its standard "
"output."
msgstr""
"一个使用 :class:`~asyncio.subprocess.Process` 类来控制子进程并用 :class:`StreamReader` "
"类来从其标准输出读取信息的示例。"
#:../../library/asyncio-subprocess.rst:353
msgid""
"The subprocess is created by the :func:`create_subprocess_exec` function::"
msgstr"这个子进程是由 :func:`create_subprocess_exec` 函数创建的::"
#:../../library/asyncio-subprocess.rst:356
msgid""
"import asyncio\n"
"import sys\n"
"\n"
"async def get_date():\n"
" code = 'import datetime; print(datetime.datetime.now())'\n"
"\n"
" # Create the subprocess; redirect the standard output\n"
" # into a pipe.\n"
" proc = await asyncio.create_subprocess_exec(\n"
" sys.executable, '-c', code,\n"
" stdout=asyncio.subprocess.PIPE)\n"
"\n"
" # Read one line of output.\n"
" data = await proc.stdout.readline()\n"
" line = data.decode('ascii').rstrip()\n"
"\n"
" # Wait for the subprocess exit.\n"
" await proc.wait()\n"
" return line\n"
"\n"
"date = asyncio.run(get_date())\n"
"print(f\"Current date: {date}\")"
msgstr""
"import asyncio\n"
"import sys\n"
"\n"
"async def get_date():\n"
" code = 'import datetime; print(datetime.datetime.now())'\n"
"\n"
" # 创建子进程;重定向标准输出\n"
" # 至一个管道中。\n"
" proc = await asyncio.create_subprocess_exec(\n"
" sys.executable, '-c', code,\n"
" stdout=asyncio.subprocess.PIPE)\n"
"\n"
" # 读取一行输出。\n"
" data = await proc.stdout.readline()\n"
" line = data.decode('ascii').rstrip()\n"
"\n"
" # 等待子进程退出。\n"
" await proc.wait()\n"
" return line\n"
"\n"
"date = asyncio.run(get_date())\n"
"print(f\"Current date: {date}\")"
#:../../library/asyncio-subprocess.rst:380
msgid""
"See also the :ref:`same example <asyncio_example_subprocess_proto>` written "
"using low-level APIs."
msgstr"另请参阅使用低层级 API 编写的 :ref:`相同示例 <asyncio_example_subprocess_proto>`。"