<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## 問題 你有一個對應于操作系統上一個已打開的I/O通道(比如文件、管道、套接字等)的整型文件描述符,你想將它包裝成一個更高層的Python文件對象。 ## 解決方案 一個文件描述符和一個打開的普通文件是不一樣的。文件描述符僅僅是一個由操作系統指定的整數,用來指代某個系統的I/O通道。如果你碰巧有這么一個文件描述符,你可以通過使用 `open()` 函數來將其包裝為一個Python的文件對象。你僅僅只需要使用這個整數值的文件描述符作為第一個參數來代替文件名即可。例如: # Open a low-level file descriptor import os fd = os.open('somefile.txt', os.O_WRONLY | os.O_CREAT) # Turn into a proper file f = open(fd, 'wt') f.write('hello world\n') f.close() 當高層的文件對象被關閉或者破壞的時候,底層的文件描述符也會被關閉。如果這個并不是你想要的結果,你可以給 `open()` 函數傳遞一個可選的 `colsefd=False` 。比如: # Create a file object, but don't close underlying fd when done f = open(fd, 'wt', closefd=False) ... ## 討論 在Unix系統中,這種包裝文件描述符的技術可以很方便的將一個類文件接口作用于一個以不同方式打開的I/O通道上,如管道、套接字等。舉例來講,下面是一個操作管道的例子: from socket import socket, AF_INET, SOCK_STREAM def echo_client(client_sock, addr): print('Got connection from', addr) # Make text-mode file wrappers for socket reading/writing client_in = open(client_sock.fileno(), 'rt', encoding='latin-1', closefd=False) client_out = open(client_sock.fileno(), 'wt', encoding='latin-1', closefd=False) # Echo lines back to the client using file I/O for line in client_in: client_out.write(line) client_out.flush() client_sock.close() def echo_server(address): sock = socket(AF_INET, SOCK_STREAM) sock.bind(address) sock.listen(1) while True: client, addr = sock.accept() echo_client(client, addr) 需要重點強調的一點是,上面的例子僅僅是為了演示內置的 `open()` 函數的一個特性,并且也只適用于基于Unix的系統。如果你想將一個類文件接口作用在一個套接字并希望你的代碼可以跨平臺,請使用套接字對象的 `makefile()` 方法。但是如果不考慮可移植性的話,那上面的解決方案會比使用 `makefile()` 性能更好一點。 你也可以使用這種技術來構造一個別名,允許以不同于第一次打開文件的方式使用它。例如,下面演示如何創建一個文件對象,它允許你輸出二進制數據到標準輸出(通常以文本模式打開): import sys # Create a binary-mode file for stdout bstdout = open(sys.stdout.fileno(), 'wb', closefd=False) bstdout.write(b'Hello World\n') bstdout.flush() 盡管可以將一個已存在的文件描述符包裝成一個正常的文件對象,但是要注意的是并不是所有的文件模式都被支持,并且某些類型的文件描述符可能會有副作用(特別是涉及到錯誤處理、文件結尾條件等等的時候)。在不同的操作系統上這種行為也是不一樣,特別的,上面的例子都不能在非Unix系統上運行。我說了這么多,意思就是讓你充分測試自己的實現代碼,確保它能按照期望工作。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看