سؤال

بادئ ذي بدء، يرجى المعذرة عن أي عدم ترابط في مربع هذا السؤال.ربما لديه بعض، ولكن في الحقيقة لا أعرف أفضل.

تم طرح هذا السؤال في سياق التحكم في iTunes عبر COM من python.

>>> itunes = win32com.client.Dispatch("iTunes.Application")
>>> itunes
<win32com.gen_py.iTunes 1.12 Type Library.IiTunes instance at 0x27248400>
>>> lib = itunes.LibraryPlaylist
>>> lib
<win32com.gen_py.iTunes 1.12 Type Library.IITLibraryPlaylist instance at 0x27249880>

ما أود القيام به هو استرداد "اي تيونز"من اي تيونز و"IITLibraryPlaylist"من ليب.لقد حاولت الكتابة (itunes) والنوع (lib) لكن كلاهما يُرجع "" فقط وهذا ليس ما أبحث عنه.

شكرًا.

هل كانت مفيدة؟

المحلول

لسوء الحظ، ليس لدي جهاز يعمل بنظام Windows في متناول اليد لتجربته، ولكن أعتقد ذلك itunes.__class__ هي فئة (old_style) من itunes الكائن المعني، و lib.__class__ أن من lib.لذلك النظر في __name__ سمة الطبقات يجب أن تعطيك ما تريد.

من المؤسف أن هذه فصول دراسية قديمة الطراز (لذا type(...) لا يعمل بشكل صحيح)، ولكن win32com موجود منذ فترة طويلة، قبل وقت طويل من ولادة فئات النمط الجديد اللامعة في Python 2.2، لذلك أعتقد أنه مفهوم تمامًا؛-).

نصائح أخرى

السبب الرئيسي لخطأ السمة هذا هو أن خادم COM الخاص بك قد تحول من الربط المتأخر (الديناميكي) إلى الربط المبكر (الثابت).

  • في Late Binding، عندما يتم استدعاء أسلوب ما، يتم الاستعلام عن الكائن عن الأسلوب، وإذا نجح، فيمكن إجراء الاستدعاء.
  • في الربط المبكر، يتم تحديد معلومات نموذج الكائن مسبقًا من معلومات النوع التي يوفرها استدعاء الكائن.يستخدم الربط المبكر MakePy.كما أن الربط المبكر حساس لحالة الأحرف.

يحاول:

itunes = win32com.client.dynamic.Dispatch("iTunes.Application")

سيؤدي هذا إلى إجبار خادم COM على التركيز على الوحدة الديناميكية التي يجب أن تمنحك كائن COM الخاص بـ iTunes فقط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top