Python3 / Windows: модуль 'os' не имеет атрибута 'mkfifo' [duplicate]

Если вы столкнулись с одной и той же проблемой даже после добавления "backend: TkAgg" в ~/.matplotlib/matplotlibrc, может возникнуть проблема с вашей виртуальной средой.

Итак, если вы используете python3, используйте venv вместо virtualenv.

Чтобы использовать venv с python3, используйте python -m venv my-virtualenv для создания виртуальной среды и используйте source my-virtualenv/bin/activate для активации virtualenv.

Rest - это то же самое, что и virtualenv. В противном случае используйте PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install x.x.x, если вы хотите использовать virtualenv как свою виртуальную среду.

4
задан SilentGhost 27 May 2010 в 15:54
поделиться

3 ответа

После двух ответов выше, я случайно столкнулся с ответом. os.pipe () выполняет эту работу. Спасибо за ваши ответы.

Я отправляю полный код на тот случай, если кто-то ищет это:

import subprocess
from threading import Thread
import time
import sys
import logging
import tempfile
import os

import game_playing_module

class Pusher(Thread):
    def __init__(self, source, dest, proc, name):
        Thread.__init__(self)
        self.source = source
        self.dest = dest
        self.name = name
        self.proc = proc

    def run(self):
        while (self.proc.poll()==None) and\
              (not self.source.closed) and (not self.source.closed):
            line = self.source.readline()
            logging.info('%s: %s' % (self.name, line[:-1]))
            self.dest.write(line)
            self.dest.flush()

def get_reader_writer():
    fd_read, fd_write = os.pipe()
    return os.fdopen(fd_read, 'r'), os.fdopen(fd_write, 'w')

def connect(exe):
    logging.basicConfig(level=logging.DEBUG,\
                        format='%(message)s',\
                        filename=LOG_FILE_NAME,
                        filemode='w')

    program_to_grader_reader, program_to_grader_writer =\
                              get_reader_writer()

    grader_to_program_reader, grader_to_program_writer =\
                              get_reader_writer()

    p1 = subprocess.Popen(exe, shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE)        

    old_stdin = sys.stdin
    old_stdout = sys.stdout

    sys.stdin = program_to_grader_reader
    sys.stdout = grader_to_program_writer

    push1 = Pusher(p1.stdout, program_to_grader_writer, p1, '1')
    push2 = Pusher(grader_to_program_reader, p1.stdin, p1, '2')

    push1.start()
    push2.start()

    game_playing_module.play()

    sys.stdin = old_stdin
    sys.stdout = old_stdout

    fil = file(LOG_FILE, 'r')
    data = fil.read()
    fil.close()
    return data

if __name__=='__main__':
    if len(sys.argv) != 2:
        print 'Usage: connect.py exe'
        print sys.argv
        exit()
    print sys.argv
    print connect(sys.argv[1])
12
ответ дан Rufflewind 18 August 2018 в 02:07
поделиться

Для кросс-платформенного решения я бы рекомендовал создать файл-подобный объект поверх сокета на localhost (127.0.0.1) - это то, что IDLE делает по умолчанию, чтобы решить проблему, которая очень похожа на вашу.

4
ответ дан Alex Martelli 18 August 2018 в 02:07
поделиться
  • 1
    Отличная идея! Не нужно гадать с трубами, когда TCP-сокет делает то же самое. – user1495323 13 July 2015 в 01:09

В Windows вы смотрите на каналы (Именованные или анонимные) .

Труба - это раздел разделяемой памяти, который обрабатывает данные для связи. Процесс, который создает канал, является сервером трубопроводов. Процесс, который соединяется с трубой, является клиентом канала. Один процесс записывает информацию в трубку, затем другой процесс считывает информацию из канала.

Для работы с Windows-трубками вы можете использовать расширения для Python для Windows (pywin32) или модуль Ctypes . Специальный модуль утилиты, win32pipe , обеспечивает интерфейс к API-интерфейсу win32. Он включает в себя реализации функций удобства popen[234]().

См. how-to-use-win32-apis-with-python и аналогичные вопросы SO (не относящиеся к Pipes, но указывает на полезную информацию).

4
ответ дан Community 18 August 2018 в 02:07
поделиться
  • 1
    так, .... почему на земле не может питон просто скопировать-вставить этот код в свою собственную функцию mkfifo? – Erik Aronesty 22 October 2017 в 23:45
Другие вопросы по тегам:

Похожие вопросы: