Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
ef347535
Unverified
Kaydet (Commit)
ef347535
authored
May 01, 2018
tarafından
Serhiy Storchaka
Kaydeden (comit)
GitHub
May 01, 2018
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
bpo-20104: Improve error handling and fix a reference leak in os.posix_spawn(). (#6332)
üst
7508a54c
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
190 additions
and
30 deletions
+190
-30
os.rst
Doc/library/os.rst
+27
-11
test_posix.py
Lib/test/test_posix.py
+160
-17
2018-04-01-19-21-04.bpo-20104.-AKcGa.rst
...S.d/next/Library/2018-04-01-19-21-04.bpo-20104.-AKcGa.rst
+1
-0
posixmodule.c.h
Modules/clinic/posixmodule.c.h
+2
-2
posixmodule.c
Modules/posixmodule.c
+0
-0
No files found.
Doc/library/os.rst
Dosyayı görüntüle @
ef347535
...
...
@@ -3365,25 +3365,41 @@ written in Python, such as a mail server's external command delivery program.
.. function:: posix_spawn(path, argv, env, file_actions=None)
Wraps the
posix_spawn()
C library API for use from Python.
Wraps the
:c:func:`posix_spawn`
C library API for use from Python.
Most users should use :
class:`subprocess.run` instead of posix_spawn
.
Most users should use :
func:`subprocess.run` instead of :func:`posix_spawn`
.
The *path*, *args*, and *env* arguments are similar to :func:`execve`.
The *file_actions* argument may be a sequence of tuples describing actions
to take on specific file descriptors in the child process between the C
library implementation's
fork and exec steps. The first item in each tuple
must be one of the three type indicator listed below describing the
remaining tuple elements:
library implementation's
:c:func:`fork` and :c:func:`exec` steps.
The first item in each tuple must be one of the three type indicator
listed below describing the
remaining tuple elements:
(os.POSIX_SPAWN_OPEN, fd, path, open flags, mode)
(os.POSIX_SPAWN_CLOSE, fd)
(os.POSIX_SPAWN_DUP2, fd, new_fd)
.. data:: POSIX_SPAWN_OPEN
These tuples correspond to the C library posix_spawn_file_actions_addopen,
posix_spawn_file_actions_addclose, and posix_spawn_file_actions_adddup2 API
calls used to prepare for the posix_spawn call itself.
(``os.POSIX_SPAWN_OPEN``, *fd*, *path*, *flags*, *mode*)
Performs ``os.dup2(os.open(path, flags, mode), fd)``.
.. data:: POSIX_SPAWN_CLOSE
(``os.POSIX_SPAWN_CLOSE``, *fd*)
Performs ``os.close(fd)``.
.. data:: POSIX_SPAWN_DUP2
(``os.POSIX_SPAWN_DUP2``, *fd*, *new_fd*)
Performs ``os.dup2(fd, new_fd)``.
These tuples correspond to the C library
:c:func:`posix_spawn_file_actions_addopen`,
:c:func:`posix_spawn_file_actions_addclose`, and
:c:func:`posix_spawn_file_actions_adddup2` API calls used to prepare
for the :c:func:`posix_spawn` call itself.
.. versionadded:: 3.7
...
...
Lib/test/test_posix.py
Dosyayı görüntüle @
ef347535
...
...
@@ -177,22 +177,6 @@ class PosixTester(unittest.TestCase):
os
.
close
(
fp
)
@unittest.skipUnless
(
hasattr
(
os
,
'posix_spawn'
),
"test needs os.posix_spawn"
)
def
test_posix_spawn
(
self
):
pid
=
posix
.
posix_spawn
(
sys
.
executable
,
[
sys
.
executable
,
"-c"
,
"pass"
],
os
.
environ
,[])
self
.
assertEqual
(
os
.
waitpid
(
pid
,
0
),(
pid
,
0
))
@unittest.skipUnless
(
hasattr
(
os
,
'posix_spawn'
),
"test needs os.posix_spawn"
)
def
test_posix_spawn_file_actions
(
self
):
file_actions
=
[]
file_actions
.
append
((
0
,
3
,
os
.
path
.
realpath
(
__file__
),
0
,
0
))
file_actions
.
append
((
os
.
POSIX_SPAWN_CLOSE
,
2
))
file_actions
.
append
((
os
.
POSIX_SPAWN_DUP2
,
1
,
4
))
pid
=
posix
.
posix_spawn
(
sys
.
executable
,
[
sys
.
executable
,
"-c"
,
"pass"
],
os
.
environ
,
file_actions
)
self
.
assertEqual
(
os
.
waitpid
(
pid
,
0
),(
pid
,
0
))
@unittest.skipUnless
(
hasattr
(
posix
,
'waitid'
),
"test needs posix.waitid()"
)
@unittest.skipUnless
(
hasattr
(
os
,
'fork'
),
"test needs os.fork()"
)
def
test_waitid
(
self
):
...
...
@@ -1437,9 +1421,168 @@ class PosixGroupsTester(unittest.TestCase):
posix
.
setgroups
(
groups
)
self
.
assertListEqual
(
groups
,
posix
.
getgroups
())
@unittest.skipUnless
(
hasattr
(
os
,
'posix_spawn'
),
"test needs os.posix_spawn"
)
class
TestPosixSpawn
(
unittest
.
TestCase
):
def
test_returns_pid
(
self
):
pidfile
=
support
.
TESTFN
self
.
addCleanup
(
support
.
unlink
,
pidfile
)
script
=
f
"""if 1:
import os
with open({pidfile!r}, "w") as pidfile:
pidfile.write(str(os.getpid()))
"""
pid
=
posix
.
posix_spawn
(
sys
.
executable
,
[
sys
.
executable
,
'-c'
,
script
],
os
.
environ
)
self
.
assertEqual
(
os
.
waitpid
(
pid
,
0
),
(
pid
,
0
))
with
open
(
pidfile
)
as
f
:
self
.
assertEqual
(
f
.
read
(),
str
(
pid
))
def
test_no_such_executable
(
self
):
no_such_executable
=
'no_such_executable'
try
:
pid
=
posix
.
posix_spawn
(
no_such_executable
,
[
no_such_executable
],
os
.
environ
)
except
FileNotFoundError
as
exc
:
self
.
assertEqual
(
exc
.
filename
,
no_such_executable
)
else
:
pid2
,
status
=
os
.
waitpid
(
pid
,
0
)
self
.
assertEqual
(
pid2
,
pid
)
self
.
assertNotEqual
(
status
,
0
)
def
test_specify_environment
(
self
):
envfile
=
support
.
TESTFN
self
.
addCleanup
(
support
.
unlink
,
envfile
)
script
=
f
"""if 1:
import os
with open({envfile!r}, "w") as envfile:
envfile.write(os.environ['foo'])
"""
pid
=
posix
.
posix_spawn
(
sys
.
executable
,
[
sys
.
executable
,
'-c'
,
script
],
{
'foo'
:
'bar'
})
self
.
assertEqual
(
os
.
waitpid
(
pid
,
0
),
(
pid
,
0
))
with
open
(
envfile
)
as
f
:
self
.
assertEqual
(
f
.
read
(),
'bar'
)
def
test_empty_file_actions
(
self
):
pid
=
posix
.
posix_spawn
(
sys
.
executable
,
[
sys
.
executable
,
'-c'
,
'pass'
],
os
.
environ
,
[]
)
self
.
assertEqual
(
os
.
waitpid
(
pid
,
0
),
(
pid
,
0
))
def
test_multiple_file_actions
(
self
):
file_actions
=
[
(
os
.
POSIX_SPAWN_OPEN
,
3
,
os
.
path
.
realpath
(
__file__
),
os
.
O_RDONLY
,
0
),
(
os
.
POSIX_SPAWN_CLOSE
,
0
),
(
os
.
POSIX_SPAWN_DUP2
,
1
,
4
),
]
pid
=
posix
.
posix_spawn
(
sys
.
executable
,
[
sys
.
executable
,
"-c"
,
"pass"
],
os
.
environ
,
file_actions
)
self
.
assertEqual
(
os
.
waitpid
(
pid
,
0
),
(
pid
,
0
))
def
test_bad_file_actions
(
self
):
with
self
.
assertRaises
(
TypeError
):
posix
.
posix_spawn
(
sys
.
executable
,
[
sys
.
executable
,
"-c"
,
"pass"
],
os
.
environ
,
[
None
])
with
self
.
assertRaises
(
TypeError
):
posix
.
posix_spawn
(
sys
.
executable
,
[
sys
.
executable
,
"-c"
,
"pass"
],
os
.
environ
,
[()])
with
self
.
assertRaises
(
TypeError
):
posix
.
posix_spawn
(
sys
.
executable
,
[
sys
.
executable
,
"-c"
,
"pass"
],
os
.
environ
,
[(
None
,)])
with
self
.
assertRaises
(
TypeError
):
posix
.
posix_spawn
(
sys
.
executable
,
[
sys
.
executable
,
"-c"
,
"pass"
],
os
.
environ
,
[(
12345
,)])
with
self
.
assertRaises
(
TypeError
):
posix
.
posix_spawn
(
sys
.
executable
,
[
sys
.
executable
,
"-c"
,
"pass"
],
os
.
environ
,
[(
os
.
POSIX_SPAWN_CLOSE
,)])
with
self
.
assertRaises
(
TypeError
):
posix
.
posix_spawn
(
sys
.
executable
,
[
sys
.
executable
,
"-c"
,
"pass"
],
os
.
environ
,
[(
os
.
POSIX_SPAWN_CLOSE
,
1
,
2
)])
with
self
.
assertRaises
(
TypeError
):
posix
.
posix_spawn
(
sys
.
executable
,
[
sys
.
executable
,
"-c"
,
"pass"
],
os
.
environ
,
[(
os
.
POSIX_SPAWN_CLOSE
,
None
)])
with
self
.
assertRaises
(
ValueError
):
posix
.
posix_spawn
(
sys
.
executable
,
[
sys
.
executable
,
"-c"
,
"pass"
],
os
.
environ
,
[(
os
.
POSIX_SPAWN_OPEN
,
3
,
__file__
+
'
\0
'
,
os
.
O_RDONLY
,
0
)])
def
test_open_file
(
self
):
outfile
=
support
.
TESTFN
self
.
addCleanup
(
support
.
unlink
,
outfile
)
script
=
"""if 1:
import sys
sys.stdout.write("hello")
"""
file_actions
=
[
(
os
.
POSIX_SPAWN_OPEN
,
1
,
outfile
,
os
.
O_WRONLY
|
os
.
O_CREAT
|
os
.
O_TRUNC
,
stat
.
S_IRUSR
|
stat
.
S_IWUSR
),
]
pid
=
posix
.
posix_spawn
(
sys
.
executable
,
[
sys
.
executable
,
'-c'
,
script
],
os
.
environ
,
file_actions
)
self
.
assertEqual
(
os
.
waitpid
(
pid
,
0
),
(
pid
,
0
))
with
open
(
outfile
)
as
f
:
self
.
assertEqual
(
f
.
read
(),
'hello'
)
def
test_close_file
(
self
):
closefile
=
support
.
TESTFN
self
.
addCleanup
(
support
.
unlink
,
closefile
)
script
=
f
"""if 1:
import os
try:
os.fstat(0)
except OSError as e:
with open({closefile!r}, 'w') as closefile:
closefile.write('is closed
%
d'
%
e.errno)
"""
pid
=
posix
.
posix_spawn
(
sys
.
executable
,
[
sys
.
executable
,
'-c'
,
script
],
os
.
environ
,
[(
os
.
POSIX_SPAWN_CLOSE
,
0
),])
self
.
assertEqual
(
os
.
waitpid
(
pid
,
0
),
(
pid
,
0
))
with
open
(
closefile
)
as
f
:
self
.
assertEqual
(
f
.
read
(),
'is closed
%
d'
%
errno
.
EBADF
)
def
test_dup2
(
self
):
dupfile
=
support
.
TESTFN
self
.
addCleanup
(
support
.
unlink
,
dupfile
)
script
=
"""if 1:
import sys
sys.stdout.write("hello")
"""
with
open
(
dupfile
,
"wb"
)
as
childfile
:
file_actions
=
[
(
os
.
POSIX_SPAWN_DUP2
,
childfile
.
fileno
(),
1
),
]
pid
=
posix
.
posix_spawn
(
sys
.
executable
,
[
sys
.
executable
,
'-c'
,
script
],
os
.
environ
,
file_actions
)
self
.
assertEqual
(
os
.
waitpid
(
pid
,
0
),
(
pid
,
0
))
with
open
(
dupfile
)
as
f
:
self
.
assertEqual
(
f
.
read
(),
'hello'
)
def
test_main
():
try
:
support
.
run_unittest
(
PosixTester
,
PosixGroupsTester
)
support
.
run_unittest
(
PosixTester
,
PosixGroupsTester
,
TestPosixSpawn
)
finally
:
support
.
reap_children
()
...
...
Misc/NEWS.d/next/Library/2018-04-01-19-21-04.bpo-20104.-AKcGa.rst
0 → 100644
Dosyayı görüntüle @
ef347535
Improved error handling and fixed a reference leak in :func:`os.posix_spawn()`.
Modules/clinic/posixmodule.c.h
Dosyayı görüntüle @
ef347535
...
...
@@ -1742,7 +1742,7 @@ PyDoc_STRVAR(os_posix_spawn__doc__,
" env
\n
"
" Dictionary of strings mapping to strings.
\n
"
" file_actions
\n
"
"
FileActions object
."
);
"
A sequence of file action tuples
."
);
#define OS_POSIX_SPAWN_METHODDEF \
{"posix_spawn", (PyCFunction)os_posix_spawn, METH_FASTCALL, os_posix_spawn__doc__},
...
...
@@ -6589,4 +6589,4 @@ exit:
#ifndef OS_GETRANDOM_METHODDEF
#define OS_GETRANDOM_METHODDEF
#endif
/* !defined(OS_GETRANDOM_METHODDEF) */
/*[clinic end generated code: output=
fc603214822bdda6
input=a9049054013a1b77]*/
/*[clinic end generated code: output=
8d3d9dddf254c3c2
input=a9049054013a1b77]*/
Modules/posixmodule.c
Dosyayı görüntüle @
ef347535
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment