2010-12-13 83 views
4

我有一個python腳本,調用基於USB的數據採集C#dotnet可執行文件。主要的python腳本還有許多其他的功能,例如它控制步進電機。我們希望檢查各種操作的相對時間,爲此目的,dotnet exe使用C#Stopwatch.GetTimestamp()中的時間戳記生成一個日誌,就我所知,它產生與調用win32 API QueryPerformanceCounter()相同的數字。python on win32:如何獲得絕對時間/ CPU週期數

現在我想從Python腳本中得到相似的數字。 time.clock()返回這樣的值,不幸的是它將第一次調用時獲得的值減去time.clock()。我怎樣才能解決這個問題?從一些現有的Python模塊中調用QueryPerformanceCounter()很容易,還是必須在C中編寫自己的Python擴展?

我忘了提,蟒蛇WMI模塊添金做到這一點: wmi.WMI()Win32_PerfRawData_PerfOS_System()[0] .Timestamp_PerfTime ,但實在是太慢了,有些過48ms的開銷。我需要< = 1ms開銷。 time.clock()似乎足夠快,正如c#Stopwatch.GetTimestamp()一樣。

TIA, 拉迪姆

回答

8

您是否嘗試過使用ctypes?

from ctypes import * 
val = c_int64() 
windll.Kernel32.QueryPerformanceCounter(byref(val)) 
print val.value 
+1

工作的很好,我可以讀取約0.5ms的讀數(與WMI的48ms相比)。謝謝你,呂克。 – 2010-12-13 16:07:56

+0

這裏是上述的擴展,用於Windows中的Python的micros(),millis(),delay()和delayMicroseconds()函數:http://stackoverflow.com/questions/38319606/how-to-get-millisecond -and微秒,分辨率時間戳功能於蟒蛇。感謝@luc提供在Python中訪問QueryPerformanceCounter的語法! – 2016-07-12 03:42:55

+0

@luc,你應該使用'val = c_uint64()'而不是'val = c_int64()'? – 2016-09-07 12:53:55

0

你可以只用Python調用C#StopWatch類直接不是嗎?也許需要一個小包裝(不知道Python/C#互操作細節 - 對不起) - 如果您已經在使用C#進行數據採集,那麼通過Stopwatch執行相同的定時應該比您可以做的任何其他操作更簡單。