私は、PIDを指定してプロセスの現在の作業ディレクトリを特定しようとしています。コマンドラインユーティリティlsofは、同様のことを行います。しかし、ctypesとlibprocを使用しているMacOS 10.6でPython 2.5とPython 2.6の間に奇妙な違いがありますproc_pidinfo
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では動作しません:ここではPythonスクリプトにソースだ
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は、「アクティビティモニタであります.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
感謝ここで何が起こっているのかについての手掛かりを持っています:)