Я пытаюсь узнать местоположение системных папок с Python 3.1. Например, "Мои Документы" = "C:\Documents and Settings\User\My Documents", "Программные файлы" = "C:\Program Files" и т.д. и т.д.
Я нашел немного другой способ сделать это . Таким образом, даст вам местоположение различных системных папок и использует реальные слова вместо 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
Я, кажется, вспоминаю трюк о создании и совместном использовании дескриптора файлов для чтения/записи между сетевым потоком и основным потоком, который добавляется к дескрипторам в вызове 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
работает просто и просто. Кроме того, у вас будет меньше кода , что всегда хорошо.
Чтобы получить папку «Мои документы», можно воспользоваться:
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,» но, надеюсь, этого будет достаточно, чтобы начать.