2013-10-21 51 views
0

我试图让我的代码在插入闪存驱动器时检测到,然后继续执行代码。我目前使用“os.path.exists”。当我使用插入的闪存驱动器启动代码时,代码运行正常,但是,如果我在拔下闪存驱动器时启动并尝试在代码运行时将其插入,代码将不检查闪存驱动器是否已插入并继续强迫代码进入睡眠状态。我怎样才能让代码工作?等待目录(Windows)存在以继续执行代码? (2.7)

import os 
import sys 
import datetime 
from datetime import datetime 
import shutil 
import time 

#Wait for FlashDrive to be connected 

if os.path.exists("F:\"): 
    connected = 1 
else: 
    connected = 0 

while connected == 0: 
    print "..." 
    time.sleep(10) 

#Get current date 
currentdate=datetime.now().strftime("%m-%d-%Y") 
print "Photos saved: " + currentdate 

#Copy and rename DCIM 
src = "F:/Pictures" 
dst = "C:/Users/Josh/Desktop/photos/" + currentdate 
shutil.copytree(src, dst) 

的代码应该是一个循环,并执行每一个iPhone连接,永不停止运行的时间,但我不能让代码,如果它并没有真正检查的闪存驱动器的工作。

+0

请注意,写入的代码是'SyntaxError',因为路径末尾的反斜杠正在转义结尾引号。处理Windows路径时,请始终使用原始字符串,转义反斜杠或使用正斜杠而不是后向斜杠。 – abarnert

+0

另一方面,不是使用'0'和'1',因为它们碰巧是虚假的,它使用'False'和'True'更清晰。而且,不是'connected == 0'(或者'connected == False'),它更具可读性,并且更加健壮,只需检查“未连接”。 – abarnert

回答

2

你的问题是htat你在循环外设置了connected变量,所以它永远不会更新。

尝试:

while not os.path.exists('F:\'): 
    print("...") 
    time.sleep(10) 

--edit ---

然后,等待它在最后被删除:

while os.path.exists('F:\'): 
    print("...") 
    time.sleep(10) 

最后,包住整个事情在一个大的while True:,以便整个程序重复。

(同样,我也同意这是一个“hackish的”和inefficent的方式做这个任务)

+0

谢谢,这工作;但是,目标是在代码的其余部分执行完毕并复制代码后重新执行代码,但代码只是在代码之后才会结束。有没有办法让我改变它,这样它会继续等待驱动器再次连接? – Argutus

+0

为此编辑了一些改进。您需要等待断开连接,并且您需要确保整个程序通过将其封装在另一个“while”循环中而进行循环。 – Murph

2

周期与一些任意sleep s不是一个好主意,(所有)。它会让你的程序对事件的响应性降低,因为在迭代开始时触发事件至少需要N ms *。由于大量的API调用,它也浪费CPU。

  1. 创建一个窗口。
  2. 收听消息循环中的WM_DEVICECHANGE消息。每当您的设备配置发生变化时它都会启动,但不会告诉您,如何。
  3. 在此类事件中,询问当前配置。

你可以找到一个教程here。另外,请看similar answer on SO

(*)如果time_passed >= sleep_timeout实际上sleep将测试每个下一个系统节拍。如果是这样,它将返回到程序。问题是系统在旧PC(56毫秒)上打勾could be 1/18 of second,所以你永远不会有10毫秒的延迟。

+0

这绝对是一种比OP更努力的方式,即使它没有直接回答他的问题,“我怎样才能让这段代码工作?”题。 – abarnert

+1

这确实是等待插入设备的“正确方法”。不断检查会消耗CPU时间,并且对更改做出响应速度较慢。但是,它更复杂。 – Murph

+0

@Murph只是以为相同并更新了答案。很高兴看到这不仅是我的意见。 –