Как я присоединяю удаленный отладчик к процессу Python?

Вы можете использовать этот метод 1, который использует ClassLoader.

 /**
 * Scans all classes accessible from the context class loader which belong to the given package and subpackages.
 *
 * @param packageName The base package
 * @return The classes
 * @throws ClassNotFoundException
 * @throws IOException
 */
private static Class[] getClasses(String packageName)
        throws ClassNotFoundException, IOException {
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    assert classLoader != null;
    String path = packageName.replace('.', '/');
    Enumeration resources = classLoader.getResources(path);
    List dirs = new ArrayList();
    while (resources.hasMoreElements()) {
        URL resource = resources.nextElement();
        dirs.add(new File(resource.getFile()));
    }
    ArrayList classes = new ArrayList();
    for (File directory : dirs) {
        classes.addAll(findClasses(directory, packageName));
    }
    return classes.toArray(new Class[classes.size()]);
}

/**
 * Recursive method used to find all classes in a given directory and subdirs.
 *
 * @param directory   The base directory
 * @param packageName The package name for classes found inside the base directory
 * @return The classes
 * @throws ClassNotFoundException
 */
private static List findClasses(File directory, String packageName) throws ClassNotFoundException {
    List classes = new ArrayList();
    if (!directory.exists()) {
        return classes;
    }
    File[] files = directory.listFiles();
    for (File file : files) {
        if (file.isDirectory()) {
            assert !file.getName().contains(".");
            classes.addAll(findClasses(file, packageName + "." + file.getName()));
        } else if (file.getName().endsWith(".class")) {
            classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6)));
        }
    }
    return classes;
}

__________ 1 Этот метод был взят из http: // фрагментов. dzone.com/posts/show/4831, который был архивирован через Интернет-архив, связанный с ним сейчас. Фрагмент также доступен в https://dzone.com/articles/get-all-classes-within-package .

53
задан joeforker 12 February 2009 в 20:54
поделиться

2 ответа

используйте Winpdb. Это независимо от платформы графический отладчик Python GPL с поддержкой удаленной отладки по сети, несколько потоков, модификация пространства имен, встроили отладку, зашифрованную коммуникацию и до 20 раз быстрее, чем pdb.

Функции:

  • лицензия GPL. Winpdb является Бесплатное программное обеспечение.
  • Совместимый с CPython 2.3 до 2,6 и Python 3000
  • , Совместимый с wxPython 2.6 до 2,8
  • Независимый от платформы, и протестированный на Ubuntu Бесстрашный и Windows XP.
  • Пользовательские интерфейсы: rpdb2 является базирующейся консолью, в то время как winpdb требует wxPython 2.6 или позже.

Screenshot
(источник: winpdb.org )

57
ответ дан Glorfindel 7 November 2019 в 18:44
поделиться

Ну, можно получить что-то весьма схожее с тем использованием скрученного кабельного колодца, который работает как это:

from twisted.internet import reactor
from twisted.cred import portal, checkers 
from twisted.conch import manhole, manhole_ssh 

def getManholeFactory(namespace):
    realm = manhole_ssh.TerminalRealm()
    def getManhole(_): 
        return manhole.Manhole(namespace) 
    realm.chainedProtocolFactory.protocolFactory = getManhole
    p = portal.Portal(realm)
    p.registerChecker(
        checkers.InMemoryUsernamePassword DatabaseDontUse(admin='foobar'))
    f = manhole_ssh.ConchFactory(p)
    return f

reactor.listenTCP(2222, getManholeFactory(globals()))
reactor.run() 

Затем Вы просто входите в программу по ssh;

$ ssh admin@localhost -p 2222
admin@localhost's password: 

Используя foobar как пароль.

, Когда Вы входите в систему, Вы получите нормальную подсказку Python, где можно просто ввести по абсолютному адресу в данных. Это - не совсем то же как получение traceback, отправленного законченным в хост.

Теперь, это могло бы быть хитро для интеграции к программе GUI, в этом случае Вы, возможно, должны были бы выбрать другой реактор, например, для базирующихся программ gtk использовал gtk2reactor и т.д.

, Если Вы хотите фактический traceback, отправленный по Вам, должен создать канал сокета и для stderr, stdin и для stdout, который пробегается через сеть вместо того, чтобы печатать к Вашему локальному хосту. Не должно быть слишком твердым для выполнения при помощи скрученного.

17
ответ дан Johan Dahlin 7 November 2019 в 18:44
поделиться
Другие вопросы по тегам:

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