python'__ file__'未在线程中定义

时间:2016-03-10 11:57:15

标签: python python-2.7

我在线程的__file__语句中使用if时出错,代码如下:

import os
from threading import Thread

def cur_dir():
    current_dir = os.path.dirname(os.path.abspath(__file__))
    print current_dir
    if "hello":
        print "in if"
        current_dir = os.path.dirname(os.path.abspath(__file__))
        print current_dir


t = Thread(target=cur_dir)
t.start()

结果是:首先current_dir始终可以打印,但第二大时间不能打印:

/private/tmp
in if
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in __bootstrap_inner
    self.run()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 763, in run
    self.__target(*self.__args, **self.__kwargs)
  File "test.py", line 9, in cur_dir
    current_dir = os.path.dirname(os.path.abspath(__file__))
NameError: global name '__file__' is not defined

2 个答案:

答案 0 :(得分:1)

您的线程在模块的生命周期内运行

启动线程后,您的Python程序就会退出。那时,Python开始清理所有内容,包括清理模块全局变量。 __file__名称是首先要做的事情之一。

如果在模块末尾添加一个睡眠,__file__名称的存在时间足以让你的线程完成:

import os
import time
from threading import Thread

def cur_dir():
    current_dir = os.path.dirname(os.path.abspath(__file__))
    print current_dir
    if "hello":
        print "in if"
        current_dir = os.path.dirname(os.path.abspath(__file__))
        print current_dir


t = Thread(target=cur_dir)
t.start()
time.sleep(1)

if声明是红鲱鱼;如果删除if但在其间留下其他语句,则会出现同样的问题。

答案 1 :(得分:1)

虽然Martijn Pieters诊断良好,但你不应该依赖时间来确保所需的变量可用(即不要依赖足够长的睡眠时间)

相反,使用Thread.join使主线程等待其子代:

t = Thread(target=cur_dir)
t.start()
t.join()

或者,当启动多个线程时:

threads = []

for i in range(5):
    t = Thread(target=cur_dir)
    t.start()
    threads.append(t)

for t in threads:
    t.join()

注意双循环,因为你想在锁定父节点之前启动所有线程,等待每个子节点完成。