Присоединение PyDev к процессу завершается с ошибкой `ModuleNotFoundError: нет модуля с именем 'add_code_to_python_process'`

Я пытаюсь использовать PyDev для подключения к процессу в MS-Windows 10. На самом деле, если быть точнее, я это делал. Это сработало чудесно, и я очень ценю это, но теперь не работает, и мне интересно, почему.

Я всегда делаю это с одним и тем же процессом, написанным на C++, который загружает интерпретатор Python внутри для запуска кода плагина Python. В прошлом я с удовольствием взламывал код плагина и отлаживал его с помощью PyDev.

Приходите в декабре 2020 года, и я попробую еще раз, и я получаю эту ошибку при попытке подключиться к тому же процессу:

Traceback (most recent call last):
  File "E:\Util\Eclipse\dropins\PyDev 8.1.0\plugins\org.python.pydev.core_8.1.0.202012051215\pysrc\pydevd_attach_to_process\attach_pydevd.py", line 72, in <module>
    main(process_command_line(sys.argv[1:]))
  File "E:\Util\Eclipse\dropins\PyDev 8.1.0\plugins\org.python.pydev.core_8.1.0.202012051215\pysrc\pydevd_attach_to_process\attach_pydevd.py", line 41, in main
    import add_code_to_python_process
ModuleNotFoundError: No module named 'add_code_to_python_process'
Process finished with exitValue: 1

В последний раз я делал это успешно примерно в октябре 2020 года. Мне это не нужно. Но когда я это делаю, это очень полезно.

Сообщение об ошибке не очень полезно для меня. Я искал в Интернете и во всех своих предыдущих заметках и не нашел подсказок.

Решающим, конечно, в любом сценарии «Работало, но не сейчас» является «что изменилось». Ну, есть несколько хороших вещей, не в последнюю очередь приложение, которое я отлаживаю, находится в постоянной разработке, и я регулярно загружаю новые сборки и запускаю их. Также я, вероятно, обновил Eclipse и определенно обновил PyDev с тех пор.

На самом деле, подозревая какое-то странное повреждение PyDev, я удалил его и установил последнюю версию, используя метод dropins Eclipse, который я всегда использовал здесь и работал нормально.

Сообщение предполагает, что это происходит со стороны Eclipse/PyDev, а не с целевым процессом. В частности, что:

E:\Util\Eclipse\dropins\PyDev 8.1.0\plugins\org.python.pydev.core_8.1.0.202012051215\pysrc\pydevd_attach_to_process\attach_pydevd.py

пытается в строке 41 перейти к import add_code_to_python_process и не может найти модуль, и, похоже, это полностью внутренняя проблема PyDev.

Но проверка установки PyDev:

E:\> tree "E:\Util\Eclipse\dropins\PyDev 8.1.0\plugins\org.python.pydev.core_8.1.0.202012051215\pysrc" /f
Folder PATH listing for volume DATA
Volume serial number is 646C-4A23
E:\UTIL\ECLIPSE\DROPINS\PYDEV 8.1.0\PLUGINS\ORG.PYTHON.PYDEV.CORE_8.1.0.202012051215\PYSRC
│   conftest.py
│   interpreterInfo.py
│   LICENSE
│   MANIFEST.in
│   pycompletionserver.py
│   pydevconsole.py
│   pydevd.py
│   pydevd_file_utils.py
│   pydevd_tracing.py
│   pydev_app_engine_debug_startup.py
│   pydev_coverage.py
│   pydev_pysrc.py
│   pydev_run_in_console.py
│   pytest.ini
│   README.rst
│   runfiles.py
│   setup.py
│   setup_cython.py
│
├───.github
│   │   install_and_run_debug_py.sh
│   │
│   └───workflows
│           pydevd-tests-python.yml
│
├───build_tools
│       build.py
│       build_binaries_osx.py
│       build_binaries_windows.py
│       check_no_git_modifications.py
│       generate_code.py
│       names_to_rename.py
│       pydevd_release_process.txt
│       rename_pep8.py
│
├───pydevd_attach_to_process
│   │   add_code_to_python_process.py
│   │   attach_amd64.dll
│   │   attach_linux_amd64.so
│   │   attach_linux_x86.so
│   │   attach_pydevd.py
│   │   attach_script.py
│   │   attach_x86.dll
│   │   attach_x86.dylib
│   │   attach_x86_64.dylib
│   │   inject_dll_amd64.exe
│   │   inject_dll_x86.exe
│   │   README.txt
│   │   run_code_on_dllmain_amd64.dll
│   │   run_code_on_dllmain_x86.dll
│   │   _always_live_program.py
│   │   _check.py
│   │   _test_attach_to_process.py
│   │   _test_attach_to_process_linux.py
│   │
│   ├───common
│   │       python.h
│   │       py_custom_pyeval_settrace.hpp
│   │       py_settrace.hpp
│   │       py_utils.hpp
│   │       py_version.hpp
│   │       ref_utils.hpp
│   │
│   ├───linux_and_mac
│   │       attach.cpp
│   │       compile_linux.sh
│   │       compile_mac.sh
│   │       lldb_prepare.py
│   │
│   ├───winappdbg
│   │   │   breakpoint.py
│   │   │   compat.py
│   │   │   crash.py
│   │   │   debug.py
│   │   │   disasm.py
│   │   │   event.py
│   │   │   interactive.py
│   │   │   module.py
│   │   │   process.py
│   │   │   registry.py
│   │   │   search.py
│   │   │   sql.py
│   │   │   system.py
│   │   │   textio.py
│   │   │   thread.py
│   │   │   util.py
│   │   │   window.py
│   │   │   __init__.py
│   │   │
│   │   ├───plugins
│   │   │       do_example.py
│   │   │       do_exchain.py
│   │   │       do_exploitable.py
│   │   │       do_symfix.py
│   │   │       README
│   │   │       __init__.py
│   │   │
│   │   └───win32
│   │           advapi32.py
│   │           context_amd64.py
│   │           context_i386.py
│   │           dbghelp.py
│   │           defines.py
│   │           gdi32.py
│   │           kernel32.py
│   │           ntdll.py
│   │           peb_teb.py
│   │           psapi.py
│   │           shell32.py
│   │           shlwapi.py
│   │           user32.py
│   │           version.py
│   │           wtsapi32.py
│   │           __init__.py
│   │
│   └───windows
│           attach.cpp
│           attach.h
│           compile_windows.bat
│           inject_dll.cpp
│           py_win_helpers.hpp
│           run_code_in_memory.hpp
│           run_code_on_dllmain.cpp
│           stdafx.cpp
│           stdafx.h
│           targetver.h
│
├───pydevd_concurrency_analyser
│       pydevd_concurrency_logger.py
│       pydevd_thread_wrappers.py
│       __init__.py
│
├───pydevd_plugins
│   │   django_debug.py
│   │   jinja2_debug.py
│   │   __init__.py
│   │
│   └───extensions
│       │   README.md
│       │   __init__.py
│       │
│       └───types
│               pydevd_helpers.py
│               pydevd_plugins_django_form_str.py
│               pydevd_plugin_numpy_types.py
│               __init__.py
│
├───pydev_ipython
│       inputhook.py
│       inputhookglut.py
│       inputhookgtk.py
│       inputhookgtk3.py
│       inputhookpyglet.py
│       inputhookqt4.py
│       inputhookqt5.py
│       inputhooktk.py
│       inputhookwx.py
│       matplotlibtools.py
│       qt.py
│       qt_for_kernel.py
│       qt_loaders.py
│       README
│       version.py
│       __init__.py
│
├───pydev_sitecustomize
│   │   sitecustomize.py
│   │   __not_in_default_pythonpath.txt
│   │
│   └───__pycache__
│           sitecustomize.cpython-38.pyc
│
├───stubs
│       pycompletion.py
│       _django_manager_body.py
│       _get_tips.py
│
├───third_party
│   │   cython_json.py
│   │   tests_cython_json.py
│   │
│   ├───isort_container
│   │   ├───backports
│   │   │       functools_lru_cache.py
│   │   │       __init__.py
│   │   │
│   │   └───isort
│   │           finders.py
│   │           hooks.py
│   │           isort.py
│   │           main.py
│   │           natural.py
│   │           pie_slice.py
│   │           pylama_isort.py
│   │           settings.py
│   │           utils.py
│   │           __init__.py
│   │           __main__.py
│   │
│   ├───pep8
│   │   │   autopep8.py
│   │   │   pycodestyle.py
│   │   │
│   │   └───lib2to3
│   │       └───lib2to3
│   │           │   btm_matcher.py
│   │           │   btm_utils.py
│   │           │   fixer_base.py
│   │           │   fixer_util.py
│   │           │   Grammar.txt
│   │           │   main.py
│   │           │   patcomp.py
│   │           │   PatternGrammar.txt
│   │           │   pygram.py
│   │           │   pytree.py
│   │           │   refactor.py
│   │           │   __init__.py
│   │           │   __main__.py
│   │           │
│   │           ├───fixes
│   │           │       fix_apply.py
│   │           │       fix_basestring.py
│   │           │       fix_buffer.py
│   │           │       fix_callable.py
│   │           │       fix_dict.py
│   │           │       fix_except.py
│   │           │       fix_exec.py
│   │           │       fix_execfile.py
│   │           │       fix_exitfunc.py
│   │           │       fix_filter.py
│   │           │       fix_funcattrs.py
│   │           │       fix_future.py
│   │           │       fix_getcwdu.py
│   │           │       fix_has_key.py
│   │           │       fix_idioms.py
│   │           │       fix_import.py
│   │           │       fix_imports.py
│   │           │       fix_imports2.py
│   │           │       fix_input.py
│   │           │       fix_intern.py
│   │           │       fix_isinstance.py
│   │           │       fix_itertools.py
│   │           │       fix_itertools_imports.py
│   │           │       fix_long.py
│   │           │       fix_map.py
│   │           │       fix_metaclass.py
│   │           │       fix_methodattrs.py
│   │           │       fix_ne.py
│   │           │       fix_next.py
│   │           │       fix_nonzero.py
│   │           │       fix_numliterals.py
│   │           │       fix_operator.py
│   │           │       fix_paren.py
│   │           │       fix_print.py
│   │           │       fix_raise.py
│   │           │       fix_raw_input.py
│   │           │       fix_reduce.py
│   │           │       fix_renames.py
│   │           │       fix_repr.py
│   │           │       fix_set_literal.py
│   │           │       fix_standarderror.py
│   │           │       fix_sys_exc.py
│   │           │       fix_throw.py
│   │           │       fix_tuple_params.py
│   │           │       fix_types.py
│   │           │       fix_unicode.py
│   │           │       fix_urllib.py
│   │           │       fix_ws_comma.py
│   │           │       fix_xrange.py
│   │           │       fix_xreadlines.py
│   │           │       fix_zip.py
│   │           │       __init__.py
│   │           │
│   │           └───pgen2
│   │                   conv.py
│   │                   driver.py
│   │                   grammar.py
│   │                   literals.py
│   │                   parse.py
│   │                   pgen.py
│   │                   token.py
│   │                   tokenize.py
│   │                   __init__.py
│   │
│   └───wrapped_for_pydev
│       │   not_in_default_pythonpath.txt
│       │
│       └───ctypes
│           │   ctypes-README.txt
│           │   util.py
│           │   wintypes.py
│           │   _ctypes.dll
│           │   _endian.py
│           │   __init__.py
│           │
│           └───macholib
│                   dyld.py
│                   dylib.py
│                   framework.py
│                   __init__.py
│
├───_pydevd_bundle
│   │   pydevconsole_code_for_ironpython.py
│   │   pydevd_additional_thread_info.py
│   │   pydevd_additional_thread_info_regular.py
│   │   pydevd_api.py
│   │   pydevd_breakpoints.py
│   │   pydevd_code_to_source.py
│   │   pydevd_collect_bytecode_info.py
│   │   pydevd_comm.py
│   │   pydevd_command_line_handling.py
│   │   pydevd_comm_constants.py
│   │   pydevd_console.py
│   │   pydevd_constants.py
│   │   pydevd_custom_frames.py
│   │   pydevd_cython.c
│   │   pydevd_cython.pxd
│   │   pydevd_cython.pyx
│   │   pydevd_cython_win32_27_32.pyd
│   │   pydevd_cython_win32_27_64.pyd
│   │   pydevd_cython_win32_36_32.cp36-win32.pyd
│   │   pydevd_cython_win32_36_64.cp36-win_amd64.pyd
│   │   pydevd_cython_win32_37_32.cp37-win32.pyd
│   │   pydevd_cython_win32_37_64.cp37-win_amd64.pyd
│   │   pydevd_cython_win32_38_32.cp38-win32.pyd
│   │   pydevd_cython_win32_38_64.cp38-win_amd64.pyd
│   │   pydevd_cython_win32_39_32.cp39-win32.pyd
│   │   pydevd_cython_win32_39_64.cp39-win_amd64.pyd
│   │   pydevd_cython_wrapper.py
│   │   pydevd_daemon_thread.py
│   │   pydevd_defaults.py
│   │   pydevd_dont_trace.py
│   │   pydevd_dont_trace_files.py
│   │   pydevd_exec.py
│   │   pydevd_exec2.py
│   │   pydevd_extension_api.py
│   │   pydevd_extension_utils.py
│   │   pydevd_filtering.py
│   │   pydevd_frame.py
│   │   pydevd_frame_utils.py
│   │   pydevd_import_class.py
│   │   pydevd_io.py
│   │   pydevd_json_debug_options.py
│   │   pydevd_net_command.py
│   │   pydevd_net_command_factory_json.py
│   │   pydevd_net_command_factory_xml.py
│   │   pydevd_plugin_utils.py
│   │   pydevd_process_net_command.py
│   │   pydevd_process_net_command_json.py
│   │   pydevd_referrers.py
│   │   pydevd_reload.py
│   │   pydevd_resolver.py
│   │   pydevd_safe_repr.py
│   │   pydevd_save_locals.py
│   │   pydevd_signature.py
│   │   pydevd_source_mapping.py
│   │   pydevd_stackless.py
│   │   pydevd_suspended_frames.py
│   │   pydevd_thread_lifecycle.py
│   │   pydevd_timeout.py
│   │   pydevd_traceproperty.py
│   │   pydevd_trace_api.py
│   │   pydevd_trace_dispatch.py
│   │   pydevd_trace_dispatch_regular.py
│   │   pydevd_utils.py
│   │   pydevd_vars.py
│   │   pydevd_vm_type.py
│   │   pydevd_xml.py
│   │   __init__.py
│   │
│   ├───_debug_adapter
│   │       debugProtocol.json
│   │       debugProtocolCustom.json
│   │       pydevd_base_schema.py
│   │       pydevd_schema.py
│   │       pydevd_schema_log.py
│   │       __init__.py
│   │       __main__pydevd_gen_debug_adapter_protocol.py
│   │
│   └───__pycache__
│           pydevd_comm_constants.cpython-38.pyc
│           pydevd_constants.cpython-38.pyc
│           pydevd_dont_trace.cpython-38.pyc
│           pydevd_frame_utils.cpython-38.pyc
│           pydevd_utils.cpython-38.pyc
│           pydevd_vm_type.cpython-38.pyc
│           __init__.cpython-38.pyc
│
├───_pydevd_frame_eval
│   │   pydevd_frame_evaluator.c
│   │   pydevd_frame_evaluator.cp38-win32.pyd
│   │   pydevd_frame_evaluator.cp38-win_amd64.pyd
│   │   pydevd_frame_evaluator.cp39-win32.pyd
│   │   pydevd_frame_evaluator.cp39-win_amd64.pyd
│   │   pydevd_frame_evaluator.pxd
│   │   pydevd_frame_evaluator.pyx
│   │   pydevd_frame_evaluator.template.pyx
│   │   pydevd_frame_evaluator_win32_36_32.cp36-win32.pyd
│   │   pydevd_frame_evaluator_win32_36_64.cp36-win_amd64.pyd
│   │   pydevd_frame_evaluator_win32_37_32.cp37-win32.pyd
│   │   pydevd_frame_evaluator_win32_37_64.cp37-win_amd64.pyd
│   │   pydevd_frame_eval_cython_wrapper.py
│   │   pydevd_frame_eval_main.py
│   │   pydevd_frame_tracing.py
│   │   pydevd_modify_bytecode.py
│   │   release_mem.h
│   │   __init__.py
│   │
│   ├───vendored
│   │   │   pydevd_fix_code.py
│   │   │   README.txt
│   │   │   __init__.py
│   │   │
│   │   └───bytecode
│   │       │   bytecode.py
│   │       │   cfg.py
│   │       │   concrete.py
│   │       │   flags.py
│   │       │   instr.py
│   │       │   peephole_opt.py
│   │       │   __init__.py
│   │       │
│   │       └───tests
│   │               test_bytecode.py
│   │               test_cfg.py
│   │               test_code.py
│   │               test_concrete.py
│   │               test_flags.py
│   │               test_instr.py
│   │               test_misc.py
│   │               test_peephole_opt.py
│   │               __init__.py
│   │
│   └───__pycache__
│           __init__.cpython-38.pyc
│
├───_pydev_bundle
│   │   pydev_console_utils.py
│   │   pydev_imports.py
│   │   pydev_import_hook.py
│   │   pydev_ipython_console.py
│   │   pydev_ipython_console_011.py
│   │   pydev_is_thread_alive.py
│   │   pydev_localhost.py
│   │   pydev_log.py
│   │   pydev_monkey.py
│   │   pydev_monkey_qt.py
│   │   pydev_override.py
│   │   pydev_umd.py
│   │   pydev_versioncheck.py
│   │   _pydev_calltip_util.py
│   │   _pydev_completer.py
│   │   _pydev_filesystem_encoding.py
│   │   _pydev_getopt.py
│   │   _pydev_imports_tipper.py
│   │   _pydev_jy_imports_tipper.py
│   │   _pydev_log.py
│   │   _pydev_tipper_common.py
│   │   __init__.py
│   │
│   └───__pycache__
│           pydev_is_thread_alive.cpython-38.pyc
│           pydev_localhost.cpython-38.pyc
│           pydev_log.cpython-38.pyc
│           _pydev_filesystem_encoding.cpython-38.pyc
│           _pydev_imports_tipper.cpython-38.pyc
│           _pydev_log.cpython-38.pyc
│           _pydev_tipper_common.cpython-38.pyc
│           __init__.cpython-38.pyc
│
├───_pydev_imps
│   │   _pydev_BaseHTTPServer.py
│   │   _pydev_execfile.py
│   │   _pydev_inspect.py
│   │   _pydev_pkgutil_old.py
│   │   _pydev_saved_modules.py
│   │   _pydev_SimpleXMLRPCServer.py
│   │   _pydev_SocketServer.py
│   │   _pydev_sys_patch.py
│   │   _pydev_xmlrpclib.py
│   │   __init__.py
│   │
│   └───__pycache__
│           _pydev_saved_modules.cpython-38.pyc
│           __init__.cpython-38.pyc
│
├───_pydev_runfiles
│       pydev_runfiles.py
│       pydev_runfiles_coverage.py
│       pydev_runfiles_nose.py
│       pydev_runfiles_parallel.py
│       pydev_runfiles_parallel_client.py
│       pydev_runfiles_pytest2.py
│       pydev_runfiles_unittest.py
│       pydev_runfiles_xml_rpc.py
│       __init__.py
│
└───__pycache__
        pydevd_file_utils.cpython-38.pyc

Затем мы видим, что add_code_to_python_process.py выглядит так, как должно быть, чтобы импортировать нормально в attach_pydevd.py, но, судя по всему, так было всегда.

Теперь я также проверил целевой процесс и настроенный интеретер Python, и я убедился, что:

  1. Используется тот же самый интерпретатор, на котором работает мой целевой процесс. Этот целевой процесс поставляется в комплекте со своим собственным интерпретатором Python и использует свою собственную папку пакетов сайта и т. д. Все не проблема, так как я просто настраиваю этот интерпретатор под интерпретаторами PyDev.
  2. Я добавляю каталог pysrcs в PYTHONPATH этого интерпретатора.

Для иллюстрации (целевая папка приложения удалена, поскольку она не имеет отношения):

Характер ошибки указывает на проблему с конфигурацией PyrDev, поскольку сам PyDev работает неправильно, но трудно понять, как это сделать, при новой установке и внешнем виде все выглядит нормально. PyDev (как и любой отладчик) немного сложен, но я прочитал все, что мог, и ничего не понял. Это не ошибка в PyDev (или я бы зарегистрировал ее), поскольку она работала (я признаю, что с предыдущей версией PyDev, поскольку я обновился, но обновление PyDev появилось только как часть моих усилий по диагностике/исправлению это, короче говоря, эта ошибка сначала появилась в более ранней версии PyDev, которую я установил, с помощью которой я в последний раз (месяц назад или с) подключил PyDev к этому же целевому процессу.

Настоящим камнем преткновения здесь является интерпретация трассировки и сообщения об ошибке.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
1 139
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это действительно немного странно, что он не находит его, учитывая, что он находится рядом с attach_pydevd.py и учитывая, что attach_pydevd.py выполняется как модуль __main__, он должен (теоретически) найти его ... но практика, кажется, иногда отличается ;)

Итак, попробуйте сделать следующее: откройте attach_pydevd.py и добавьте sys.path.append(os.path.dirname(__file__)) в качестве первой строки def main(setup):, чтобы увидеть, решит ли это вашу проблему (если это так, я также сделаю исправление на стороне отладчика).

Блестящий как всегда Фабио! Это сработало. Головоломка действительно, она работала нормально месяц назад. Внезапно нет. Месяц конечно вносит изменения в систему, работаю ежедневно, но папку Eclipse не трогаю и даже PyDev переустановил свеженько, чтобы было чисто, через папку dropins. Очень сбивает с толку.

Bernd Wechner 18.12.2020 04:46

Отлично, что сработало. Просто исправил это в: github.com/fabioz/PyDev.Debugger/commit/…... Я думаю, что это больше связано с используемым вами Python, чем с установкой (обычно это первая запись в sys.path является пустым "", указывающим на начальный каталог, но там что-то кажется другим). В любом случае, здорово, что теперь это работает!

Fabio Zadrozny 18.12.2020 11:31

Другие вопросы по теме