setnicka / ulozto-downloader

EOL - end of life | Uloz.to quick multiple sessions downloader
MIT License
278 stars 46 forks source link

multiprocessing na win 10 #33

Closed muniv11111 closed 3 years ago

muniv11111 commented 3 years ago
File "<string>", line 1, in <module>
  File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\multiprocessing\spawn.py", line 116, in spawn_main
    exitcode = _main(fd, parent_sentinel)
  File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\multiprocessing\spawn.py", line 125, in _main
    prepare(preparation_data)
  File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\multiprocessing\spawn.py", line 236, in prepare
    _fixup_main_from_path(data['init_main_from_path'])
  File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\multiprocessing\spawn.py", line 287, in _fixup_main_from_path
    main_content = runpy.run_path(main_path,
  File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\runpy.py", line 263, in run_path
    return _run_module_code(code, init_globals, run_name,
  File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\runpy.py", line 96, in _run_module_code
    _run_code(code, mod_globals, init_globals,
  File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "C:\Users\muniv\AppData\Local\Programs\Python\Python38-32\Scripts\ulozto-downloader", line 40, in <module>
    d.download(args.url, args.parts, args.output)
  File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\site-packages\ulozto_downloader\downloader.py", line 196, in download
    self.captcha_process.start()
  File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\multiprocessing\process.py", line 121, in start
    self._popen = self._Popen(self)
  File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\multiprocessing\context.py", line 224, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\multiprocessing\context.py", line 326, in _Popen
    return Popen(process_obj)
  File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\multiprocessing\popen_spawn_win32.py", line 45, in __init__
    prep_data = spawn.get_preparation_data(process_obj._name)
  File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\multiprocessing\spawn.py", line 154, in get_preparation_data
    _check_not_importing_main()
  File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\multiprocessing\spawn.py", line 134, in _check_not_importing_main
    raise RuntimeError('''
RuntimeError: 
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.
^C

asi bude potřeba udělat něco takového, ale jsem na to slabý.. :-)

viz.: https://stackoverflow.com/questions/60266256/how-to-fix-multiprocessing-problems-in-python-in-windows10

setnicka commented 3 years ago

To nevypadá hezky :(

Nemám teď rychle po ruce žádné Win k testu, ale zkusil jsem přesunout věci v main v hlavním skriptu pod __main__ check a vystřelil verzi 1.5.2. Zkus na ní updatovat (pip3 install --upgrade ulozto-downloader) a ozkoušej to prosím znovu.

Pokud to nepomůže, tak si na to zkusím najít čas během týdne a zkusím to zreplikovat na nějakých Windows.

muniv11111 commented 3 years ago
[Part 1]  Waiting for CAPTCHA...[Part 2]    Waiting for CAPTCHA...[Part 3]    Waiting for CAPTCHA...[Part 4]   Waiting for CAPTCHA...Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\multiprocessing\spawn.py", line 116, in spawn_main
    exitcode = _main(fd, parent_sentinel)
  File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\multiprocessing\spawn.py", line 126, in _main
    self = reduction.pickle.load(from_parent)
AttributeError: 'Downloader' object has no attribute '__captcha_breaker'

`

někde něco nesedí...

setnicka commented 3 years ago

No, Downloader má určitě metodu __captcha_breaker, ale tohle bude nějaká specialita Multiprocessing. Zkusím na to přijít.

muniv11111 commented 3 years ago

Jinak já mám svou verzi co jsem nějak vyladil v srpnu, funguje i na pornfile a je v jednom py scriptu jak to bylo puvodně.. která používá k řešení captcha webovou aplikaci z herokuapp.. ale ta je asi tajná.. :-) jen jsem na ni přišel v tom srpnu bo to tu někdo zminoval a fiddler na sledování sitoveho provozu mi pomohl ji najít.. už presně nevím jak sem ji objevil a kdo ji provozuje na tom herokuapp.. ale vyhoda je že mi funguje bez tensorflow na serveru bez X... ten tflite co potrebuje tvoje verze k auto-captcha to je další problém co mi nejde na win amd x64 naistalovat.. furt píše neco toto whl není na teto platformě podporováno.. přitom architektura i verze pythonu by měla být srpávná.. takže moje haluz verze je zatím jediné co mi jede na win i na serveru bez X.. ach jo ty windows..

Koticka commented 3 years ago

Tak asi jsem přišel na řešení:

https://stackoverflow.com/questions/517970/how-to-clear-the-interpreter-console V kódu je os.system("clear"), to funguje na linuxu. Na windowsu je cls.

Dále, jak to padá na chybějící attribut __captcha_breaker. Stačilo opravit to na jedno podtržítko. Prefix dvou podtržítek používá python pro nějaké své interní věci, jedno podtržítko se má používat na "privátní" metody atd.

Nakonec, první chybu lze vyřešit nějakým hackem ze SO. ulozto-downloader nemá definovanou main metodu, tak jsem ji vytvořil a nechal ji volat z if name == "main" bloku, a funguje.

Vypadá to, že to funguje, vytvořím PR.

muniv11111 commented 3 years ago

File "ulozto-downloader", line 47, in main() File "ulozto-downloader", line 43, in main d.download(args.url, args.parts, args.output) File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\site-packages\ulozto_downloader\downloader.py", line 236, in download p.start() File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\multiprocessing\process.py", line 121, in start self._popen = self._Popen(self) File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\multiprocessing\context.py", line 224, in _Popen return _default_context.get_context().Process._Popen(process_obj) File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\multiprocessing\context.py", line 326, in _Popen return Popen(process_obj) File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\multiprocessing\popen_spawn_win32.py", line 93, in init reduction.dump(process_obj, to_child) File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\multiprocessing\reduction.py", line 60, in dump ForkingPickler(file, protocol).dump(obj) TypeError: cannot pickle 'weakref' object Traceback (most recent call last): File "", line 1, in File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\multiprocessing\spawn.py", line 116, in spawn_main exitcode = _main(fd, parent_sentinel) File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\multiprocessing\spawn.py", line 126, in _main self = reduction.pickle.load(from_parent) EOFError: Ran out of input

tak nevím mne to pořád nejede, na začátku to hodilo tohle, pak to sice po minutě chce pokažré třikrát zadat captcha, ale nesputí se ani jedno stahování, už to běží asi 10 minut... jedu teda bez tensorflow bo ten mi proste nejde z neznámých duvodu na win naistalovat.. na linux to šlo bez problémů..

tohle vyskočilo po násilném ukončení:

Traceback (most recent call last): File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\multiprocessing\process.py", line 315, in _bootstrap self.run() File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\site-packages\ulozto_downloader\downloader.py", line 58, in _captcha_breaker page.get_captcha_download_link( File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\site-packages\ulozto_downloader\page.py", line 111, in get_captcha_download_link captcha_answer = captcha_solve_func(captcha_image, print_func=print_func) File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\site-packages\ulozto_downloader\captcha.py", line 44, in tkinter_user_prompt root.mainloop() # Wait for user input File "c:\users\muniv\appdata\local\programs\python\python38-32\lib\tkinter__init__.py", line 1420, in mainloop self.tk.mainloop(n) KeyboardInterrupt [?25hTerminating download. Please wait for stopping all processes. Download terminated. Program terminated.

Koticka commented 3 years ago

@muniv11111 U mě to jede, zkusil jsem to na verzi Python 3.6.8.

Zkoušíš správnou verzi (není to zamergované)? Zkusil jsi vytvořit nový environment? Máš 64-bit windows? Co má za problém ten Tensorflow Lite Interpreter při instalaci? Máš chybovou hlášku?

Tak dodám, že na Pythonu 3.8 jsem to teď zkusil, a píše mi to tu samou chybu :-(

muniv11111 commented 3 years ago

ten tensorflow hází: .whl is not supported wheel on this platform.. mám Quad-core AMD Ryzen 5 r5-3550h processor Windows 10 64-bit.. nevím jsem z toho jelen.. dával jsem tohle istalovat: https://github.com/google-coral/pycoral/releases/download/release-frogfish/tflite_runtime-2.5.0-cp38-cp38-win_amd64.whl

a nevadí třeba v něčem že mám ten python 3.8 jako 32 bit aplikaci??? python mám jen jako velmi okrajovou zábavu a nevím proč ho mám v 32bit verzi, a všiml jsem si to až ted když vidím ty chybové logy..

Koticka commented 3 years ago

@muniv11111 Aby ti jelo tensorflow, tak potřebuješ mít Python 64-bitů myslím.

Koticka commented 3 years ago

@muniv11111 Mohl bys to zkusit na Pythonu 3.6? Toto bude na dlouho.

Je tam asi problém s picklením při startování procesu. Bohužel nevidím teď jednoduchý způsob, jak toto vyřešit.

Koticka commented 3 years ago

Tak problém spočíval v picklení funkcí při vytváření procesů, na verzi 3.8 windows s tím je z nějakého důvodu problém. Změnil jsem některé funkce, co nepotřebovaly self, na static, a vyřešilo se to tím.

muniv11111 commented 3 years ago

@Koticka Na to self jsem dokonce koukal než jsem sem hodil issue, že to v té mé haluz verzi co jede nemám.. ale nevěděl jsem už cos s tím dál... :-) otestuju co nejdřív a dám vědět...

takže super - vypadá že ta static @Koticka metoda na 3.8 fachá jak bez tensorflow na python 3.8 32 bit tak i s tensorflow na python 3.8 64bitové verzi s auto-captcha

edit: ale asi to ještě nebude uplně to pravé ořechové - zkoušel jsem tu vzorovou auto-captcha 15 parts debian-9.6.0-amd64-netinst.iso, stáhli se kompletně 4 části a celé se to kouslo...

jinak ale mne ten tensorflow zas tak netrápí.. jde mi hlavně o provoz na serveru bez X, a tam jsem s tím taky v koncích něco doinstalovávat nebo kompilovat aby to tam běželo bez nějakého tkinter tensorflow. atd .. jediné řešení tam zatím mám to herokuapp louskání captcha ..

jinak tam používám ještě pyload na 2.7 na uloz.to to je taky alternativa... ale nepodporuje zřejme více paralelních stahování.. zkusím to autorovi navrhnout... :-) vím že ted dělají nějakou novou verzi pyLoad Next co už běží na 3.6+, která je snad v nějaké aplha verzi.. ale ještě jsme ji nekoumal co mí..

Koticka commented 3 years ago

@muniv11111 Díky. Něco jsem tam ještě upravil, možná to pomůže. Mohl bys to otestovat u sebe? U mě na windowsu to jede.

muniv11111 commented 3 years ago

@Koticka supr jede - jak bez tensorflow na python 3.8 32 bit tak i s tensorflow na python 3.8 64bitové verzi s auto-captcha zkoušeno opět na 15 parts debian-9.6.0-amd64-netinst.iso, staženo cca za 5 minut takže cca třikrát rychleji než obvykle a to je ted špička doma.. :-)

sinepgnol commented 3 years ago

Zdravim, tak bohuzial u mna stale ta ista chyba. Mam najnovsiu verziu ulozto-downloadera, skusal som aj upgrade podla prikazu pip3 install --upgrade ulozto-downloaderpip3 install --upgrade ulozto-downloader. Ficim na macOS s pythonom 3.8.5. `% ulozto-downloader --output /Volumes/moje\ data/Walovi\ filky --auto-captcha https://pornfile.cz/file/ncxjrSfhn/romky-a-jejich-videa-47-mp4 Starting downloading for url 'https://pornfile.cz/file/ncxjrSfhn/romky-a-jejich-videa-47-mp4' Getting info (filename, filesize, ...) CAPTCHA protected download - CAPTCHA challenges will be displayed

[ignored] torpy.documents.network_status.FetchDescriptorError: Can't fetch descriptor from http://95.211.118.194:7003/tor/server/fp/49FE0485D1D958CE0024D06AA4CB99E84A6DAD22 [CAPTCHA solve] CAPTCHA auto solved as 'atgz' File: Romky a jejich videa (47).mp4 URL: https://pornfile.cz/file/ncxjrSfhn/romky-a-jejich-videa-47-mp4 Download type: CAPTCHA protected download Total size: 565.3MB Parts: 10 x 56.53MB

[Part 1] Waiting for CAPTCHA... [Part 2] Waiting for CAPTCHA... [Part 3] Waiting for CAPTCHA... [Part 4] Waiting for CAPTCHA... [Part 5] Waiting for CAPTCHA... [Part 6] Waiting for CAPTCHA... [Part 7] Waiting for CAPTCHA... [Part 8] Waiting for CAPTCHA... [Part 9] Waiting for CAPTCHA... [Part 10] Waiting for CAPTCHA...Traceback (most recent call last): File "/Users/Martin/.pyenv/versions/3.8.5/bin/ulozto-downloader", line 48, in main() File "/Users/Martin/.pyenv/versions/3.8.5/bin/ulozto-downloader", line 44, in main d.download(args.url, args.parts, args.output) File "/Users/Martin/.pyenv/versions/3.8.5/lib/python3.8/site-packages/ulozto_downloader/downloader.py", line 209, in download self.captcha_process.start() File "/Users/Martin/.pyenv/versions/3.8.5/lib/python3.8/multiprocessing/process.py", line 121, in start self._popen = self._Popen(self) File "/Users/Martin/.pyenv/versions/3.8.5/lib/python3.8/multiprocessing/context.py", line 224, in _Popen return _default_context.get_context().Process._Popen(process_obj) File "/Users/Martin/.pyenv/versions/3.8.5/lib/python3.8/multiprocessing/context.py", line 284, in _Popen return Popen(process_obj) File "/Users/Martin/.pyenv/versions/3.8.5/lib/python3.8/multiprocessing/popen_spawn_posix.py", line 32, in init super().init(process_obj) File "/Users/Martin/.pyenv/versions/3.8.5/lib/python3.8/multiprocessing/popen_fork.py", line 19, in init self._launch(process_obj) File "/Users/Martin/.pyenv/versions/3.8.5/lib/python3.8/multiprocessing/popen_spawn_posix.py", line 47, in _launch reduction.dump(process_obj, fp) File "/Users/Martin/.pyenv/versions/3.8.5/lib/python3.8/multiprocessing/reduction.py", line 60, in dump ForkingPickler(file, protocol).dump(obj) TypeError: cannot pickle 'generator' object

`

raptorxcz commented 3 years ago

Já mám podobnou chybu a taky z macOS:

Size / parts:   1850.78MB => 10 x 185.08MB
[Part 0]    Waiting for CAPTCHA...
[Part 1]    Waiting for CAPTCHA...
[Part 2]    Waiting for CAPTCHA...
[Part 3]    Waiting for CAPTCHA...
[Part 4]    Waiting for CAPTCHA...
[Part 5]    Waiting for CAPTCHA...
[Part 6]    Waiting for CAPTCHA...
[Part 7]    Waiting for CAPTCHA...
[Part 8]    Waiting for CAPTCHA...
[Part 9]    Waiting for CAPTCHA...Traceback (most recent call last):
  File "/usr/local/bin/ulozto-downloader", line 8, in <module>
[Progress]   0.00 MB (0.00 %)   avg. speed: 0.00 MB/s   curr. speed: 0.00 MB/s  remaining: 0:00:00
  File "/usr/local/lib/python3.9/site-packages/uldlib/cmd.py", line 44, in run
    d.download(args.url, args.parts, args.output)
  File "/usr/local/lib/python3.9/site-packages/uldlib/downloader.py", line 306, in download
    self.captcha_process.start()
  File "/usr/local/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/process.py", line 121, in start
    self._popen = self._Popen(self)
  File "/usr/local/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/context.py", line 224, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "/usr/local/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/context.py", line 284, in _Popen
    return Popen(process_obj)
  File "/usr/local/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_spawn_posix.py", line 32, in __init__
    super().__init__(process_obj)
  File "/usr/local/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_fork.py", line 19, in __init__
    self._launch(process_obj)
  File "/usr/local/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_spawn_posix.py", line 47, in _launch
    reduction.dump(process_obj, fp)
  File "/usr/local/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
TypeError: cannot pickle 'weakref' object

Python 3.9.6