Вы можете использовать этот метод 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 .
используйте Winpdb. Это независимо от платформы графический отладчик Python GPL с поддержкой удаленной отладки по сети, несколько потоков, модификация пространства имен, встроили отладку, зашифрованную коммуникацию и до 20 раз быстрее, чем pdb.
Функции:
(источник: winpdb.org )
Ну, можно получить что-то весьма схожее с тем использованием скрученного кабельного колодца, который работает как это:
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, который пробегается через сеть вместо того, чтобы печатать к Вашему локальному хосту. Не должно быть слишком твердым для выполнения при помощи скрученного.