Найдите местоположения системной папки в Python

Я пытаюсь узнать местоположение системных папок с Python 3.1. Например, "Мои Документы" = "C:\Documents and Settings\User\My Documents", "Программные файлы" = "C:\Program Files" и т.д. и т.д.

9
задан cdiggins 24 November 2011 в 17:57
поделиться

2 ответа

Я нашел немного другой способ сделать это . Таким образом, даст вам местоположение различных системных папок и использует реальные слова вместо CLSID.

import win32com.client
objShell = win32com.client.Dispatch("WScript.Shell")
allUserDocs = objShell.SpecialFolders("AllUsersDesktop")
print allUserDocs

Другие доступные папки: AllusersDesktop, AllusersStartmenu, AllusersPrograms, AllusersStartup, Настольный компьютер, Избранное, Шрифты, Мидокументы, Nethood, Принт, Недавние, Недавние, SendTo, Startmenu, Startup & Templates

9
ответ дан 4 December 2019 в 11:05
поделиться

Я, кажется, вспоминаю трюк о создании и совместном использовании дескриптора файлов для чтения/записи между сетевым потоком и основным потоком, который добавляется к дескрипторам в вызове select. Этот fd имеет один байт, записанный в него главным потоком, когда ему есть что отправить. Запись пробуждает сетевой поток из вызова выбора, и сетевой поток затем захватывает данные из общего буфера и записывает их в сеть, затем возвращается в спящий режим в выбранном.

Извините, если это немного расплывчато и не хватает кода... и моя память может быть неправильной.. так что другим, возможно, придется направлять вас дальше.

-121--2948983-

По моему опыту, это не так просто. Встроенный клиент PHP SOAP не работает с SOAP-сервером на основе .NET, который нам пришлось использовать. Он пожаловался на недопустимое определение схемы. Несмотря на то, что клиент .NET работал с этим сервером нормально. Кстати, позвольте мне утверждать, что совместимость SOAP - это миф.

Следующим шагом был NuSOAP . Это сработало довольно долго. Кстати, ради Бога, не забудьте кэшировать WSDL! Но даже при кэшировании WSDL пользователи жаловались, что чертовски медленно.

Затем мы решили открыть HTTP, собрав запросы и прочитав ответы с помощью SimpleXMLElemnt , вот так:

$request_info = array();

$full_response = @http_post_data(
    'http://example.com/OTA_WS.asmx',
    $REQUEST_BODY,
    array(
        'headers' => array(
            'Content-Type' => 'text/xml; charset=UTF-8',
            'SOAPAction'   => 'HotelAvail',
        ),
        'timeout' => 60,

    ),
    $request_info
);

$response_xml = new SimpleXMLElement(strstr($full_response, '<?xml'));

foreach ($response_xml->xpath('//@HotelName') as $HotelName) {
    echo strval($HotelName) . "\n";
}

Обратите внимание, что в PHP 5,2 вам понадобится pecl_http, насколько (сюрприз-сюрприз!) нет встроенного HTTP-клиента.

Оголение HTTP увеличило время просить SOAP более чем на 30%. И с этого момента мы перенаправляем все жалобы производительности на серверных парней.

В конце концов, я бы рекомендовал этот последний подход, а не из-за производительности. Я думаю, что в общем, в динамическом языке, таком как PHP, нет никакой выгоды от всего этого WSDL/type-control. Вам не нужна модная библиотека для чтения и записи XML, со всем, что блокирует генерацию и динамические прокси. Ваш язык уже динамичен, и SimpleXMLElement работает просто и просто. Кроме того, у вас будет меньше кода , что всегда хорошо.

-121--1075855-

Чтобы получить папку «Мои документы», можно воспользоваться:

from win32com.shell import shell
df = shell.SHGetDesktopFolder()
pidl = df.ParseDisplayName(0, None,  
    "::{450d8fba-ad25-11d0-98a8-0800361b1103}")[1]
mydocs = shell.SHGetPathFromIDList(pidl)
print mydocs

Из здесь .

Я не уверен, что эквивалентная волшебная инктантация для «Program Files,» но, надеюсь, этого будет достаточно, чтобы начать.

4
ответ дан 4 December 2019 в 11:05
поделиться
Другие вопросы по тегам:

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