@@ -3738,13 +3738,27 @@ def write(self, file_des, contents):
3738
3738
file_handle = self .filesystem .get_open_file (file_des )
3739
3739
if isinstance (file_handle , FakeDirWrapper ):
3740
3740
self .filesystem .raise_os_error (errno .EBADF , file_handle .file_path )
3741
+
3742
+ if isinstance (file_handle , FakePipeWrapper ):
3743
+ return file_handle .write (contents )
3744
+
3741
3745
file_handle .raw_io = True
3742
3746
file_handle ._sync_io ()
3743
3747
file_handle .update_flush_pos ()
3744
3748
file_handle .write (contents )
3745
3749
file_handle .flush ()
3746
3750
return len (contents )
3747
3751
3752
+ def pipe (self ):
3753
+ read_fd , write_fd = os .pipe ()
3754
+ read_wrapper = FakePipeWrapper (self .filesystem , read_fd )
3755
+ file_des = self .filesystem ._add_open_file (read_wrapper )
3756
+ read_wrapper .filedes = file_des
3757
+ write_wrapper = FakePipeWrapper (self .filesystem , write_fd )
3758
+ file_des = self .filesystem ._add_open_file (write_wrapper )
3759
+ write_wrapper .filedes = file_des
3760
+ return read_wrapper .filedes , write_wrapper .filedes
3761
+
3748
3762
@staticmethod
3749
3763
def stat_float_times (newvalue = None ):
3750
3764
"""Determine whether a file's time stamps are reported as floats
@@ -5019,6 +5033,37 @@ def close(self):
5019
5033
self ._filesystem ._close_open_file (self .filedes )
5020
5034
5021
5035
5036
+ class FakePipeWrapper (object ):
5037
+ """Wrapper for a read or write descriptor of a real pipe object to be
5038
+ used in open files list.
5039
+ """
5040
+
5041
+ def __init__ (self , filesystem , fd ):
5042
+ self ._filesystem = filesystem
5043
+ self .fd = fd # the real file descriptor
5044
+ self .filedes = None
5045
+
5046
+ def get_object (self ):
5047
+ return None
5048
+
5049
+ def fileno (self ):
5050
+ """Return the fake file descriptor of the pipe object."""
5051
+ return self .filedes
5052
+
5053
+ def read (self , numBytes ):
5054
+ """Read from the real pipe."""
5055
+ return os .read (self .fd , numBytes )
5056
+
5057
+ def write (self , contents ):
5058
+ """Write to the real pipe."""
5059
+ return os .write (self .fd , contents )
5060
+
5061
+ def close (self ):
5062
+ """Close the pipe descriptor."""
5063
+ self ._filesystem .open_files [self .filedes ].remove (self )
5064
+ os .close (self .fd )
5065
+
5066
+
5022
5067
Deprecator .add (FakeFileWrapper , FakeFileWrapper .get_object , 'GetObject' )
5023
5068
Deprecator .add (FakeFileWrapper , FakeFileWrapper .size , 'Size' )
5024
5069
0 commit comments