Проблемы работы Python Multiprocessing в Windows
Значит проблема такая: написал прогу , которая ютуб гоняет через прокси-сервер nodpi от Lord_of_Rings: https://habr.com/ru/articles/870110/
Код пишу всегда в Linux, запустилась, проверил, всё работает. Затем решил запилить exe-шник под винду, раскопал старый ноут с виндой восьмёркой, и началось…
Ввожу в коммандную строку: python -m starter.py
Вывод:

Ну я такой: ОК, понял
Пишу: python -m starter
Не тут-то было:

Код проги лежит на: https://github.com/MATE-linux/Youtube-app-with-nodpi
P.S. Пробовал указать полный путь к интерпретатору. Итог:
P.P.S. ошибка была в использование python3 в subprocess, исправил на python, однако путь с использованием subprocess был неверен, т.к. после компиляции он не имеет смысла. Сейчас я переписал весь код в один файл, однако теперь он не запускается в винде совсем. Логи тоже отсутствуют. При компиляции в linux он не видит сети. Ниже идёт обновлённый код:
import random
import asyncio
BLOCKED = [line.rstrip().encode() for line in open('blacklist.txt', 'r', encoding='utf-8')]
TASKS = []
async def main(host, port):
server = await asyncio.start_server(new_conn, host, port)
await server.serve_forever()
async def pipe(reader, writer):
while not reader.at_eof() and not writer.is_closing():
try:
writer.write(await reader.read(1500))
await writer.drain()
except:
break
writer.close()
async def new_conn(local_reader, local_writer):
http_data = await local_reader.read(1500)
try:
type, target = http_data.split(b"\r\n")[0].split(b" ")[0:2]
host, port = target.split(b":")
except:
local_writer.close()
return
if type != b"CONNECT":
local_writer.close()
return
local_writer.write(b'HTTP/1.1 200 OK\n\n')
await local_writer.drain()
try:
remote_reader, remote_writer = await asyncio.open_connection(host, port)
except:
local_writer.close()
return
if port == b'443':
await fragemtn_data(local_reader, remote_writer)
TASKS.append(asyncio.create_task(pipe(local_reader, remote_writer)))
TASKS.append(asyncio.create_task(pipe(remote_reader, local_writer)))
async def fragemtn_data(local_reader, remote_writer):
head = await local_reader.read(5)
data = await local_reader.read(1500)
parts = []
if all([data.find(site) == -1 for site in BLOCKED]):
remote_writer.write(head + data)
await remote_writer.drain()
return
while data:
part_len = random.randint(1, len(data))
parts.append(bytes.fromhex("1603") + bytes([random.randint(0, 255)]) + int(
part_len).to_bytes(2, byteorder='big') + data[0:part_len])
data = data[part_len:]
remote_writer.write(b''.join(parts))
await remote_writer.drain()
def run_function():
asyncio.run(main(host='127.0.0.1', port=8881))
from multiprocessing import Process
from PyQt5 import QtWebEngineWidgets
from PyQt5 import QtCore, QtGui, QtWidgets, QtNetwork, QtWebEngineWidgets
from PyQt5.QtGui import QIcon
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.webView = QtWebEngineWidgets.QWebEngineView(self.centralwidget)
self.webView.setUrl(QtCore.QUrl("https://www.youtube.com"))
self.webView.setObjectName("webView")
self.gridLayout.addWidget(self.webView, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("Youtube", "Youtube"))
MainWindow.setWindowIcon(QIcon('youtube.png'))
def interface_window():
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
proxy = QtNetwork.QNetworkProxy()
proxy.setType(QtNetwork.QNetworkProxy.HttpProxy)
proxy.setHostName("127.0.0.1")
proxy.setPort(8881)
QtNetwork.QNetworkProxy.setApplicationProxy(proxy)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
def subrun():
run_function()
def substart():
interface_window()
def run():
p1 = Process(target=subrun, args=(), daemon=True)
p2 = Process(target=substart, args=(), daemon=True)
p1.start()
p2.start()
p1.join()
p2.join()
if __name__ == '__main__':
run()
Ответы (1 шт):
Путь через subprocess был ошибочен. А multiprocessing конфликтовал с asyncio. Переработал код на threading и ошибка исправлена