Странное различие между Python 2.5 и Python 2.6 в MacOS 10.6 с использованием ctypes и libproc proc_pidinfo - PullRequest
0 голосов
/ 20 января 2012

Я пытаюсь определить текущий рабочий каталог процесса, учитывая его PID. Утилита командной строки lsof делает нечто подобное. Вот источник скрипта Python:

import ctypes
from ctypes import util
import sys

PROC_PIDVNODEPATHINFO = 9

proc = ctypes.cdll.LoadLibrary(util.find_library("libproc"))
print(proc.proc_pidinfo)

class vnode_info(ctypes.Structure):
    _fields_ = [('data', ctypes.c_ubyte * 152)]

class vnode_info_path(ctypes.Structure):
    _fields_ = [('vip_vi', vnode_info), ('vip_path', ctypes.c_char * 1024)]

class proc_vnodepathinfo(ctypes.Structure):
    _fields_ = [('pvi_cdir', vnode_info_path), ('pvi_rdir', vnode_info_path)]

inst = proc_vnodepathinfo()
pid = int(sys.argv[1])
ret = proc.proc_pidinfo( pid, PROC_PIDVNODEPATHINFO, 0, ctypes.byref(inst), ctypes.sizeof(inst) )
print(ret, inst.pvi_cdir.vip_path)

Однако, несмотря на то, что этот скрипт ведет себя как положено в Python 2.6, он не работает в Python 2.5:

host:dir user$ sudo /usr/bin/python2.6 script.py 2698
<_FuncPtr object at 0x100419ae0>
(2352, '/')
host:dir user$ sudo /usr/bin/python2.5 script.py 2698
<_FuncPtr object at 0x19fdc0>
(0, '')

(PID 2698 - «Activity Monitor.app»). Обратите внимание на разные возвращаемые значения. Поскольку эта программа сильно основана на ctypes, я не могу представить никакой разницы в самом Python, которая могла бы вызвать это. Такое же поведение (как в Python 2.5) происходит с моим собственным Python 3.2.

Я не уверен, какую информацию о версиях я могу дать, чтобы помочь отследить странности - или даже найти решение для 2.5 - но вот кое-что:

host:dir user$ otool -L /usr/bin/python2.6
/usr/bin/python2.6:
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
host:dir user$ otool -L /usr/bin/python2.5
/usr/bin/python2.5 (architecture i386):
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
/usr/bin/python2.5 (architecture ppc7400):
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)


host:dir user$ uname -a
Darwin host.local 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun  7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386

Спасибо всем, кто имеет представление о том, что здесь происходит:)

1 Ответ

0 голосов
/ 30 июня 2012

Я не уверен, что не так с вашим кодом, но я только что реализовал это в psutil. Это интересующие части:

Вы можете либо перевести это в ctypes, либо написать свой собственный модуль расширения.

...