Форум сайта python.su
Имеется программа, которая порождает дочерний процесс ветвлением (использую Cygwin) и общается с ним при помощи двух каналов. Сама программа по сути только передает туда-сюда сообщения, но у меня, почему-то возникает ошибка. Весь день пролазил, но так и не понял почему. Мб знает кто, в чем проблема? Заранее благодарю! p.s. Пример из книги: М. Лутц “Программирование на Python, т.1”
Вывод:
Kancler@Kanc1er-pc ~
$ python myprogs/pipes.py
Child 1849 of 1848 got arg: "spam"
Traceback (most recent call last):
File "myprogs/pipes.py", line 31, in <module>
reply = input()
File "<string>", line 1
Child 1849 got: ('Hello 1 from parent ', 1848)
^
SyntaxError: invalid syntax
Kancler@Kanc1er-pc ~
$ Traceback (most recent call last):
File "myprogs/pipe-testchild.py", line 10, in <module>
recv = input()
EOFError: EOF when reading a line
import os, sys def spawn(prog, *args): # имя программы, аргументы командной строки stdinFd = sys.stdin.fileno() # получить дескрипторы потоков stdoutFd = sys.stdout.fileno() parentIn, childOut = os.pipe() # создать два канала IPC childIn, parentOut = os.pipe() # pipe возвращает (inputfd, outoutfd) pid = os.fork() # создать копию процесса if pid: os.close(childOut) # в родительском после ветвления: os.close(childIn) # закрыть дочерние концы в родителе os.dup2(parentIn, stdinFd) # копия sys.stdin = pipe1[0] os.dup2(parentOut, stdoutFd) # копия sys.stdout = pipe2[1] else: os.close(parentIn) # в дочернем после ветвления: os.close(parentOut) # закрыть родительские концы os.dup2(childIn, stdinFd) # копия sys.stdin = pipe2[0] os.dup2(childOut, stdoutFd) # копия sys.stdout = pipe1[1] args = (prog,) + args os.execvp(prog, args) # запустить новую программу assert False, 'execvp failed!' if __name__ == '__main__': mypid = os.getpid() spawn('python', 'myprogs/pipe-testchild.py', 'spam') # породить дочернюю прогр. print('Hello 1 from parent ', mypid) # в stdin дочерней прогр. sys.stdout.flush() # вытолкнуть буфер stdio reply = input() # из потока вывода потомка sys.stderr.write('Parent got: "%s"\n' % reply) # stderr не связан с каналом print('Hello 2 from parent ', mypid) sys.stdout.flush() reply = input() sys.stderr.write('Parent got: "%s"\n' % reply[-1])
import os, sys, time mypid = os.getpid() parentpid = os.getppid() sys.stderr.write('Child %d of %d got arg: "%s"\n' % (mypid, parentpid, sys.argv[1])) for i in range(2): time.sleep(2) # приостановить родительский процесс recv = input() # stdin связан с каналом: данные будут поступать из time.sleep(2) # родительского потока вывода stdout send = 'Child %d got: %s' % (mypid, recv) print(send) # stdout связан с каналом: данные будут поступать в # родительский поток ввода stdin sys.stdout.flush() # гарантировать отправку, иначе процесс заблокируется
Отредактировано kancler (Ноя. 8, 2020 11:01:03)
Офлайн
kanclerА что такое $s?sys.stderr.write('Parent got: "$s"\n' % reply)
Офлайн
py.user.nextМой косяк, извиняюсь, но ошибка все та же. Полностью скопировав пример из книги терминал выдает все то же сообщение об ошибке ;(
Отредактировано kancler (Ноя. 8, 2020 11:03:16)
Офлайн
import numpy as np
a=np.arange(12)
print(a)
Вот такой код я набрал в пайчарм ,заранее установил numpy и выходит ошибка:
Traceback (most recent call last):
File “CUsers/Lenovo/PycharmProjects/pythonProject1/numpy.py”, line 1, in <module>
import numpy
File “C:\Users\Lenovo\PycharmProjects\pythonProject1\numpy.py”, line 2, in <module>
a=numpy.arange(12)
AttributeError: partially initialized module ‘numpy’ has no attribute ‘arange’ (most likely due to a circular import)
Process finished with exit code 1
все делал как по книге
Помогите пожалуйста разобраться
Офлайн
simonovaleksandrЕсть модуль numpy и есть твой модуль numpy. Когда ты делаешь import, поиск идёт сначала в текущей директории, а уже потом в директориях интерпретатора Python. Поэтому модуль импортирует сам себя из своей же директории. Переименуй свой модуль в текущей директории, назови файл хотя бы как mynumpy.py .File "C:\Users\Lenovo\PycharmProjects\pythonProject1\numpy.py"
Отредактировано py.user.next (Ноя. 16, 2020 22:50:42)
Офлайн
Спасибо большое
Офлайн
Значит вот так по модулями, библиотекам не надо файлы называть?
Офлайн
Значит вот так по модулями, библиотекам не надо файлы называть?
Офлайн
simonovaleksandrПочему? Если это именно то чего вы хотите то надо. Например может вы хотите подменить стандартный модуль на свой. Механизмы импорта работают по четко определенным правилам, вы получаете именно то что запросили.
Значит вот так по модулями, библиотекам не надо файлы называть?
Офлайн