Python论坛  - 讨论区

标题:[python-chinese] 多层次程序调试时候的相对路径错误问题

2005年07月06日 星期三 23:54

amingsc amingsc at 163.com
Wed Jul 6 23:54:00 HKT 2005

在将程序组织成若干层次的时候,如果在底层需要设置文件的相对路径,则在调试的时候会有问题,我举例说明.
比如程序如图组织:
     |------module1.py:main
     |
     |------package 
             |-------module2.py
			 |-------data
下面是代码文件:
--------------------------------module1.py 主模块:
from package.module2 import fun

fun()

-----------------------module2.py:
filename = r'package\data'

def fun():
	f= open(filename,'r')
	f.close()

if __name__ == '__main__': #调试
	fun() 

---------------------------
问题:直接运行module1程序是正确的,但是我们在写程序的时候往往需要对当前的模块进行调试,
所以在写module2的时候,调试模块则会出错(因为这时文件data的相对路径应该是r'data',而不是r'package\data')

我处理这个问题的方法是:在定义filename的时候进行判断,比如:
if __name__ == '__main__':
	filename = r'data' #调试用
else:
	filename = r'package\data'

但是这里又有个问题,就是如果程序的层次再增加几层的话,在每层分别进行调试的时候会出现一样的路径错误

不知道大家在处理这个问题的时候怎么弄的?有没有更现代的办法?


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年07月06日 星期三 23:58

Qiangning Hong hongqn at gmail.com
Wed Jul 6 23:58:56 HKT 2005

On 7/6/05, amingsc <amingsc at 163.com> wrote:
> 在将程序组织成若干层次的时候,如果在底层需要设置文件的相对路径,则在调试的时候会有问题,我举例说明.
> 比如程序如图组织:
>      |------module1.py:main
>      |
>      |------package
>              |-------module2.py
>                          |-------data
> 下面是代码文件:
[...]
> -----------------------module2.py:
> filename = r'package\data'

这里改成:

import os.path
filename = os.path.join(os.path.dirname(__file__), 'data')

[...]
> 问题:直接运行module1程序是正确的,但是我们在写程序的时候往往需要对当前的模块进行调试,
> 所以在写module2的时候,调试模块则会出错(因为这时文件data的相对路径应该是r'data',而不是r'package\data')
[...]


-- 
Qiangning Hong
Get Firefox! <http://www.spreadfirefox.com/?q=affiliates&id=67907&t=1>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年07月07日 星期四 08:30

limodou limodou at gmail.com
Thu Jul 7 08:30:13 HKT 2005

简单的方法我想也许是将顶层目录加入到sys.path,然后从头导入模块。

在 05-7-6,amingsc<amingsc at 163.com> 写道:
> 在将程序组织成若干层次的时候,如果在底层需要设置文件的相对路径,则在调试的时候会有问题,我举例说明.
> 比如程序如图组织:
>      |------module1.py:main
>      |
>      |------package
>              |-------module2.py
>                          |-------data
> 下面是代码文件:
> --------------------------------module1.py 主模块:
> from package.module2 import fun
> 
> fun()
> 
> -----------------------module2.py:
> filename = r'package\data'
> 
> def fun():
>         f= open(filename,'r')
>         f.close()
> 
> if __name__ == '__main__': #调试
>         fun()
> 
> ---------------------------
> 问题:直接运行module1程序是正确的,但是我们在写程序的时候往往需要对当前的模块进行调试,
> 所以在写module2的时候,调试模块则会出错(因为这时文件data的相对路径应该是r'data',而不是r'package\data')
> 
> 我处理这个问题的方法是:在定义filename的时候进行判断,比如:
> if __name__ == '__main__':
>         filename = r'data' #调试用
> else:
>         filename = r'package\data'
> 
> 但是这里又有个问题,就是如果程序的层次再增加几层的话,在每层分别进行调试的时候会出现一样的路径错误
> 
> 不知道大家在处理这个问题的时候怎么弄的?有没有更现代的办法?
> 
> 
> _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
> 
> 
> 


-- 
I like python! 
My Donews Blog: http://www.donews.net/limodou
New Google Maillist: http://groups-beta.google.com/group/python-cn

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年07月07日 星期四 09:09

jam.zheng jam.zheng at achievo.com
Thu Jul 7 09:09:09 HKT 2005

请问各位大侠:
         我在很多python源码看到有如下代码:
                       if __name__ == '__main__':
                             fun()
请问这是什么意思?请高手赐教!



Best regards,
* * * * * * *
Jam Zheng
Engineer of Software Section 1
Achievo China
Phone: (86-755) 2603-0128 X203
Fax:  (86-755) 2603-0138

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20050707/17fe2bb4/attachment.htm

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年07月07日 星期四 09:17

Zoom Quiet zoom.quiet at gmail.com
Thu Jul 7 09:17:39 HKT 2005

我感觉,自调试时可以随意写,
但是作为向外部提供数据服务时,最好进行标准的模块或是包操作
可以象limodou 的 newEdit 那样

在模块目录的 __init__.py 中显要的声明
import m1.py
import m2.py
...

或是,学习其它产品让 __init__.py 可以自动将所有下属文件加载到 name space 中:
import sys,os,string
import fnmatch
# 自动声明所有模块
# Define what gets imported with a 'from IPython import *'
__all__ = []
for f in os.listdir('相对主脚本的路径'):
	if fnmatch.fnmatch(f, '*.py'):
		#print f		
		if ("__init__" in f):
			pass
		else:
			__all__.append(string.split(f,".")[0])
	#m = f.replace('.py', '')
	#__all__.append(m)
print __all__
# Load __all__ in namespace so that a simple 'import modName' gives
# access to them via modName.
glob,loc = globals(),locals()
for name in __all__:
    __import__(name,glob,loc,[])


以上!


在 05-7-7,limodou<limodou at gmail.com> 写道:
> 简单的方法我想也许是将顶层目录加入到sys.path,然后从头导入模块。
> 
> 在 05-7-6,amingsc<amingsc at 163.com> 写道:
> > 在将程序组织成若干层次的时候,如果在底层需要设置文件的相对路径,则在调试的时候会有问题,我举例说明.
> > 比如程序如图组织:
> >      |------module1.py:main
> >      |
> >      |------package
> >              |-------module2.py
> >                          |-------data
> > 下面是代码文件:
> > --------------------------------module1.py 主模块:
> > from package.module2 import fun
> >
> > fun()
> >
> > -----------------------module2.py:
> > filename = r'package\data'
> >
> > def fun():
> >         f= open(filename,'r')
> >         f.close()
> >
> > if __name__ == '__main__': #调试
> >         fun()
> >
> > ---------------------------
> > 问题:直接运行module1程序是正确的,但是我们在写程序的时候往往需要对当前的模块进行调试,
> > 所以在写module2的时候,调试模块则会出错(因为这时文件data的相对路径应该是r'data',而不是r'package\data')
> >
> > 我处理这个问题的方法是:在定义filename的时候进行判断,比如:
> > if __name__ == '__main__':
> >         filename = r'data' #调试用
> > else:
> >         filename = r'package\data'
> >
> > 但是这里又有个问题,就是如果程序的层次再增加几层的话,在每层分别进行调试的时候会出现一样的路径错误
> >
> > 不知道大家在处理这个问题的时候怎么弄的?有没有更现代的办法?
> >
> >
> > _______________________________________________
> > python-chinese list
> > python-chinese at lists.python.cn
> > http://python.cn/mailman/listinfo/python-chinese
> >
> >
> >
> 
> 
> --
> I like python!
> My Donews Blog: http://www.donews.net/limodou
> New Google Maillist: http://groups-beta.google.com/group/python-cn
> 
> _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
> 
> 
> 


-- 
[Time is unimportant, only life important!]

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年07月07日 星期四 09:20

Zoom Quiet zoom.quiet at gmail.com
Thu Jul 7 09:20:05 HKT 2005

一言以蔽之的话就是:
模块自测调用!

在 05-7-7,jam.zheng<jam.zheng at achievo.com> 写道:
>  
> 
> 请问各位大侠:
>          我在很多python源码看到有如下代码:
>                        if __name__ == '__main__':
>                              fun()
> 请问这是什么意思?请高手赐教!
> 
>  
> 
> Best regards,
> * * * * * * *
> Jam Zheng
> Engineer of Software Section 1
> Achievo China
> Phone: (86-755) 2603-0128 X203
> Fax:  (86-755) 2603-0138
>  
> _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
> 
> 
> 


-- 
[Time is unimportant, only life important!]

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年07月07日 星期四 09:22

Simple qsb at nlbmol.ibp.ac.cn
Thu Jul 7 09:22:46 HKT 2005

google if __name__ == '__main__' 中文的
第一条
http://cn.diveintopython.org/odbchelper_testing.html
第四条
hedong.3322.org/archives/000276.html

如果直接运行模块, __name__ 的值将是一个特别的缺省值, __main__

大概是这个意思
差点想说STFW了,哎

在 2005年7月7日 星期四 09:09,jam.zheng 写道:
> 请问各位大侠:
>          我在很多python源码看到有如下代码:
>                        if __name__ == '__main__':
>                              fun()
> 请问这是什么意思?请高手赐教!
>
>
>
> Best regards,
> * * * * * * *
> Jam Zheng
> Engineer of Software Section 1
> Achievo China
> Phone: (86-755) 2603-0128 X203
> Fax:  (86-755) 2603-0138

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年07月07日 星期四 09:35

jam.zheng jam.zheng at achievo.com
Thu Jul 7 09:35:40 HKT 2005

能不能说详细点,大侠们,我查阅那个中文的python手册,没有这个__main__的介绍~
?~?

-----Original Message-----
From: python-chinese-bounces at lists.python.cn
[mailto:python-chinese-bounces at lists.python.cn]On Behalf Of Simple
Sent: Thursday, July 07, 2005 9:23 AM
To: python-chinese at lists.python.cn
Subject: Re: [python-chinese] 为什么python总有这个代码?


google if __name__ == '__main__' 中文的
第一条
http://cn.diveintopython.org/odbchelper_testing.html
第四条
hedong.3322.org/archives/000276.html

如果直接运行模块, __name__ 的值将是一个特别的缺省值, __main__

大概是这个意思
差点想说STFW了,哎

在 2005年7月7日 星期四 09:09,jam.zheng 写道:
> 请问各位大侠:
>          我在很多python源码看到有如下代码:
>                        if __name__ == '__main__':
>                              fun()
> 请问这是什么意思?请高手赐教!
>
>
>
> Best regards,
> * * * * * * *
> Jam Zheng
> Engineer of Software Section 1
> Achievo China
> Phone: (86-755) 2603-0128 X203
> Fax:  (86-755) 2603-0138


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年07月07日 星期四 09:36

shhgs shhgs.efhilt at gmail.com
Thu Jul 7 09:36:38 HKT 2005

首先解释一下 __name__

当你定义了一个module、类或者方法的时候,这个module、类或方法会自动获得一个__name__属性,其值就是类或方法的名字。

然后我们再来看__name__ == '__main__'的含义。

你写的代码可能是直接运行的,也可能只是一个lib。当这个程序直接运行的时候,它的__name__属性就是'__main__',而当它被其它程序import的时候,这个__name__就是文件名。

下面我们看一个例子

##------------------------------------
## lib.py
def func() :
      print 'hello'

print __name__
##-------------------------------------

##-------------------------------------
## call.py
import lib

lib.func()
##-------------------------------------

当你运行lib.py的时候,屏幕会显示__main__,这表示运行lib.py时,lib module的__name__属性的值是__main__

当你运行call.py时,屏幕会显示 
--------------
hello
lib
--------------
这时,由于lib是又call.py调用的,因此其__name__属性的值就变成文件名了

最后再来看为什么要有 
if __name__ == "__main__" :

很明显,call.py要用的是lib的func函数,它并不想让lib执行print
__name__。但是lib不管三七二十一,import之后就运行。这并不是我们所希望的,但是让lib能自动运行又是必须的(比如说测试),因此你可以用
if __name__ == "__main__" :
将要运行的程序同不运行的程序隔离开来。当你直接运行lib.py的时候,lib的__name__值是__main__,因此这段代码就运行了,当你运行其它程序调用lib的时候,lib的__name__属性是lib,因此下面这段代码就不运行了。

我想这样解释应该比较清楚了吧。




On 7/6/05, jam.zheng <jam.zheng at achievo.com> wrote:
> 
> 
> 请问各位大侠:
>          我在很多python源码看到有如下代码:
>                        if __name__ == '__main__':
>                              fun()
> 请问这是什么意思?请高手赐教!
> 
> 
> 
> Best regards,
> * * * * * * *
> Jam Zheng
> Engineer of Software Section 1
> Achievo China
> Phone: (86-755) 2603-0128 X203
> Fax:  (86-755) 2603-0138
> 
> _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
> 
> 
>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年07月07日 星期四 09:49

Zoom Quiet zoom.quiet at gmail.com
Thu Jul 7 09:49:49 HKT 2005

咳咳咳,也可以这样讲,
Python 或是所有语言中都有这样那样的开发技巧,
但是并不意味着我们必须全部知道,使用,
对你没有需要的功能,技巧,不用理会的…………

在 05-7-7,shhgs<shhgs.efhilt at gmail.com> 写道:
> 首先解释一下 __name__
> 
> 当你定义了一个module、类或者方法的时候,这个module、类或方法会自动获得一个__name__属性,其值就是类或方法的名字。
> 
> 然后我们再来看__name__ == '__main__'的含义。
> 
> 你写的代码可能是直接运行的,也可能只是一个lib。当这个程序直接运行的时候,它的__name__属性就是'__main__',而当它被其它程序import的时候,这个__name__就是文件名。
> 
> 下面我们看一个例子
> 
> ##------------------------------------
> ## lib.py
> def func() :
>       print 'hello'
> 
> print __name__
> ##-------------------------------------
> 
> ##-------------------------------------
> ## call.py
> import lib
> 
> lib.func()
> ##-------------------------------------
> 
> 当你运行lib.py的时候,屏幕会显示__main__,这表示运行lib.py时,lib module的__name__属性的值是__main__
> 
> 当你运行call.py时,屏幕会显示
> --------------
> hello
> lib
> --------------
> 这时,由于lib是又call.py调用的,因此其__name__属性的值就变成文件名了
> 
> 最后再来看为什么要有
> if __name__ == "__main__" :
> 
> 很明显,call.py要用的是lib的func函数,它并不想让lib执行print
> __name__。但是lib不管三七二十一,import之后就运行。这并不是我们所希望的,但是让lib能自动运行又是必须的(比如说测试),因此你可以用
> if __name__ == "__main__" :
> 将要运行的程序同不运行的程序隔离开来。当你直接运行lib.py的时候,lib的__name__值是__main__,因此这段代码就运行了,当你运行其它程序调用lib的时候,lib的__name__属性是lib,因此下面这段代码就不运行了。
> 
> 我想这样解释应该比较清楚了吧。
> 
> 
> On 7/6/05, jam.zheng <jam.zheng at achievo.com> wrote:
> >
> >
> > 请问各位大侠:
> >          我在很多python源码看到有如下代码:
> >                        if __name__ == '__main__':
> >                              fun()
> > 请问这是什么意思?请高手赐教!
> >
> >
> >
> > Best regards,
> > * * * * * * *
> > Jam Zheng
> > Engineer of Software Section 1
> > Achievo China
> > Phone: (86-755) 2603-0128 X203
> > Fax:  (86-755) 2603-0138
> >
> > _______________________________________________
> > python-chinese list
> > python-chinese at lists.python.cn
> > http://python.cn/mailman/listinfo/python-chinese
> >
> >
> >
> 
> _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
> 
> 
> 


-- 
[Time is unimportant, only life important!]

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年07月07日 星期四 09:51

Bruce Who whoonline at msn.com
Thu Jul 7 09:51:53 HKT 2005

DQo9PT09PT09IDIwMDUtMDctMDYgMjE6MTk6MjggTGVvIHdyb3RlOiA9PT09PT09DQoNCj7I57n7
1ea1xM/rzqpQWVRIT07X9rXjysIsxOPSstDtt8XG+sTjtcRJREXQsLbxwtuxyL3PusMuDQoNCiAg
ICChsNf2tePKwqGxo7/Tw8C0y7V6ccvGuvWyu8yruau1wLDJoaPWwdPattRJREW49sjLtrzT0NfU
vLq1xM+yusOjrMv70rLDu8e/xsjE47K708NJREWwyaO/DQoNCj5QWVRIT07Oqsqyw7Sz9s/WP7K7
vs3Kx9PQ0OjSqsLwPw0KPs6qyrLDtMTHw7S24MjLzOG8sCK6w7XEUFlUSE9OIElERSI/srvSssrH
09DQ6NKqwvA/DQo+xNG1wFBZVEhPTtOmuMO437jf1NrJz7XY0qrH88v509DIy7PJzqrOxLG+seC8
rSvD/MHu0NC1xNDFzb0/DQo+DQo+1NogMDUtNi0xN6OsWm9vbSBRdWlldDx6b29tLnF1aWV0QGdt
YWlsLmNvbT4g0LS1wKO6DQo+PiCwptG90b2jodDWtdy948PDw8fExKOhDQo+PiBJREUgysfQsLbx
tcSjoQ0KPj4gyM66zr+qt6K1xLio1vq5pL7ftryyu8TctPrM5sjLtcTLvM6so6ENCj4+INK7uPbT
0brDo6y437y2tcRJREW78tDtv8nE3LDLs8m2+bTzuMW/ydLU0K3W+sTjIrjf0KcitcTN6rPJ0ru4
9rrcQ29vbCC1xNHdyr65pL7fo6y1q8rHo6zTwNS2sru/ycTc0K3W+sTjw/ew19Om08OjrNPv0dSj
rMrAvefWrrzktcTOosPuudjPtaOhDQo+PiANCj4+ILu5ysfOxLG+seC8rSvD/MHu0NDX7sus1rHB
y6Oho6GjoQ0KPj4g1eLA78TjysfW99TXo6HKx8Tj1NrT68rAvee21Luwo6y2+MO709DB7dK7uPay
u9aqy/nOvbXEtqvO99/r37ajobTyts/E47XEy7zCt6Oho6GjoQ0KPj4gDQo+PiCGlIaUhpSjoQ0K
Pj4gDQo+PiDU2iAwNS02LTE3o6zMqbSrIM7CPHdlbmR3Z2hpdEB5YWhvby5jb20uY24+INC0tcCj
ug0KPj4gPiC+zcrHyrnTwyBweXRob24gaWRsZSwgxuTL+7XEtry78rbgu/LJ2dPQuty24MLpt7O1
xM7KzOINCj4+ID4NCj4+ID4gWmhpanVuIExpdSA8aGl0LnplYWxvdXNAZ21haWwuY29tPiDQtLXA
o7oNCj4+ID4gtPO80rrDo6zO0srH0MLAtLXEo6ENCj4+ID4NCj4+ID4gz+vH67TzvNLNxrz20ru4
9tPF0OO1xMPit9G1xHB5dGhvbiBJREUstPO80su1y7WwyaO/DQo+PiA+IF9fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQo+PiA+IHB5dGhvbi1jaGluZXNlIGxp
c3QNCj4+ID4gcHl0aG9uLWNoaW5lc2VAbGlzdHMucHl0aG9uLmNuDQo+PiA+IGh0dHA6Ly9weXRo
b24uY24vbWFpbG1hbi9saXN0aW5mby9weXRob24tY2hpbmVzZQ0KPj4gPg0KPj4gPg0KPj4gPiBf
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KPj4gPiC4
z7/s16Ky4dHFu6KzrLTzyN3Bv8Pit9HTys/kPw0KPj4gPiBodHRwOi8vY24ubWFpbC55YWhvby5j
b20NCj4+ID4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18N
Cj4+ID4gcHl0aG9uLWNoaW5lc2UgbGlzdA0KPj4gPiBweXRob24tY2hpbmVzZUBsaXN0cy5weXRo
b24uY24NCj4+ID4gaHR0cDovL3B5dGhvbi5jbi9tYWlsbWFuL2xpc3RpbmZvL3B5dGhvbi1jaGlu
ZXNlDQo+PiA+DQo+PiA+DQo+PiA+DQo+PiANCj4+IC0tDQo+PiBbVGltZSBpcyB1bmltcG9ydGFu
dCwgb25seSBsaWZlIGltcG9ydGFudCFdDQo+PiANCj4+IF9fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fDQo+PiBweXRob24tY2hpbmVzZSBsaXN0DQo+PiBweXRo
b24tY2hpbmVzZUBsaXN0cy5weXRob24uY24NCj4+IGh0dHA6Ly9weXRob24uY24vbWFpbG1hbi9s
aXN0aW5mby9weXRob24tY2hpbmVzZQ0KPj4gDQo+PiANCj4+DQo+X19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCj5weXRob24tY2hpbmVzZSBsaXN0DQo+cHl0
aG9uLWNoaW5lc2VAbGlzdHMucHl0aG9uLmNuDQo+aHR0cDovL3B5dGhvbi5jbi9tYWlsbWFuL2xp
c3RpbmZvL3B5dGhvbi1jaGluZXNlDQo+DQoNCj0gPSA9ID0gPSA9ID0gPSA9ID0gPSA9ID0gPSA9
ID0gPSA9ID0gPQ0KCQkJDQpCZXN0IHJlZ2FyZHMsDQoNCqGhoaGhoaGhoaGhoaGhoaFCcnVjZSBX
aG8NCqGhoaGhoaGhoaGhoaGhoaGhoaGhMjAwNS0wNy0wNw0KDQo=

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年07月07日 星期四 09:54

limodou limodou at gmail.com
Thu Jul 7 09:54:49 HKT 2005

你那个是我很早版本使用__import__的处理,现在已经全部为标准的包方式。

在 05-7-7,Zoom Quiet<zoom.quiet at gmail.com> 写道:
> 我感觉,自调试时可以随意写,
> 但是作为向外部提供数据服务时,最好进行标准的模块或是包操作
> 可以象limodou 的 newEdit 那样
> 
> 在模块目录的 __init__.py 中显要的声明
> import m1.py
> import m2.py
> ...
> 
> 或是,学习其它产品让 __init__.py 可以自动将所有下属文件加载到 name space 中:
> import sys,os,string
> import fnmatch
> # 自动声明所有模块
> # Define what gets imported with a 'from IPython import *'
> __all__ = []
> for f in os.listdir('相对主脚本的路径'):
>         if fnmatch.fnmatch(f, '*.py'):
>                 #print f
>                 if ("__init__" in f):
>                         pass
>                 else:
>                         __all__.append(string.split(f,".")[0])
>         #m = f.replace('.py', '')
>         #__all__.append(m)
> print __all__
> # Load __all__ in namespace so that a simple 'import modName' gives
> # access to them via modName.
> glob,loc = globals(),locals()
> for name in __all__:
>     __import__(name,glob,loc,[])
> 
> 以上!
> 
> 在 05-7-7,limodou<limodou at gmail.com> 写道:
> > 简单的方法我想也许是将顶层目录加入到sys.path,然后从头导入模块。
> >
> > 在 05-7-6,amingsc<amingsc at 163.com> 写道:
> > > 在将程序组织成若干层次的时候,如果在底层需要设置文件的相对路径,则在调试的时候会有问题,我举例说明.
> > > 比如程序如图组织:
> > >      |------module1.py:main
> > >      |
> > >      |------package
> > >              |-------module2.py
> > >                          |-------data
> > > 下面是代码文件:
> > > --------------------------------module1.py 主模块:
> > > from package.module2 import fun
> > >
> > > fun()
> > >
> > > -----------------------module2.py:
> > > filename = r'package\data'
> > >
> > > def fun():
> > >         f= open(filename,'r')
> > >         f.close()
> > >
> > > if __name__ == '__main__': #调试
> > >         fun()
> > >
> > > ---------------------------
> > > 问题:直接运行module1程序是正确的,但是我们在写程序的时候往往需要对当前的模块进行调试,
> > > 所以在写module2的时候,调试模块则会出错(因为这时文件data的相对路径应该是r'data',而不是r'package\data')
> > >
> > > 我处理这个问题的方法是:在定义filename的时候进行判断,比如:
> > > if __name__ == '__main__':
> > >         filename = r'data' #调试用
> > > else:
> > >         filename = r'package\data'
> > >
> > > 但是这里又有个问题,就是如果程序的层次再增加几层的话,在每层分别进行调试的时候会出现一样的路径错误
> > >
> > > 不知道大家在处理这个问题的时候怎么弄的?有没有更现代的办法?
> > >
> > >
> > > _______________________________________________
> > > python-chinese list
> > > python-chinese at lists.python.cn
> > > http://python.cn/mailman/listinfo/python-chinese
> > >
> > >
> > >
> >
> >
> > --
> > I like python!
> > My Donews Blog: http://www.donews.net/limodou
> > New Google Maillist: http://groups-beta.google.com/group/python-cn
> >
> > _______________________________________________
> > python-chinese list
> > python-chinese at lists.python.cn
> > http://python.cn/mailman/listinfo/python-chinese
> >
> >
> >
> 
> --
> [Time is unimportant, only life important!]
> 


-- 
I like python! 
My Donews Blog: http://www.donews.net/limodou
New Google Maillist: http://groups-beta.google.com/group/python-cn

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年07月07日 星期四 09:55

limodou limodou at gmail.com
Thu Jul 7 09:55:43 HKT 2005

在diveintopython有详细的说明,可能python的教程中也有,找找看吧。

在 05-7-7,jam.zheng<jam.zheng at achievo.com> 写道:
> 能不能说详细点,大侠们,我查阅那个中文的python手册,没有这个__main__的介绍~
> ?~?
> 
> -----Original Message-----
> From: python-chinese-bounces at lists.python.cn
> [mailto:python-chinese-bounces at lists.python.cn]On Behalf Of Simple
> Sent: Thursday, July 07, 2005 9:23 AM
> To: python-chinese at lists.python.cn
> Subject: Re: [python-chinese] 为什么python总有这个代码?
> 
> google if __name__ == '__main__' 中文的
> 第一条
> http://cn.diveintopython.org/odbchelper_testing.html
> 第四条
> hedong.3322.org/archives/000276.html
> 
> 如果直接运行模块, __name__ 的值将是一个特别的缺省值, __main__
> 
> 大概是这个意思
> 差点想说STFW了,哎
> 
> 在 2005年7月7日 星期四 09:09,jam.zheng 写道:
> > 请问各位大侠:
> >          我在很多python源码看到有如下代码:
> >                        if __name__ == '__main__':
> >                              fun()
> > 请问这是什么意思?请高手赐教!
> >
> >
> >
> > Best regards,
> > * * * * * * *
> > Jam Zheng
> > Engineer of Software Section 1
> > Achievo China
> > Phone: (86-755) 2603-0128 X203
> > Fax:  (86-755) 2603-0138
> 
> _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
> 


-- 
I like python! 
My Donews Blog: http://www.donews.net/limodou
New Google Maillist: http://groups-beta.google.com/group/python-cn

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年07月07日 星期四 09:57

limodou limodou at gmail.com
Thu Jul 7 09:57:33 HKT 2005

唉,我早就解释过了。是没看见吗?

在 05-7-7,shhgs<shhgs.efhilt at gmail.com> 写道:
> 首先解释一下 __name__
> 
> 当你定义了一个module、类或者方法的时候,这个module、类或方法会自动获得一个__name__属性,其值就是类或方法的名字。
> 
> 然后我们再来看__name__ == '__main__'的含义。
> 
> 你写的代码可能是直接运行的,也可能只是一个lib。当这个程序直接运行的时候,它的__name__属性就是'__main__',而当它被其它程序import的时候,这个__name__就是文件名。
> 
> 下面我们看一个例子
> 
> ##------------------------------------
> ## lib.py
> def func() :
>       print 'hello'
> 
> print __name__
> ##-------------------------------------
> 
> ##-------------------------------------
> ## call.py
> import lib
> 
> lib.func()
> ##-------------------------------------
> 
> 当你运行lib.py的时候,屏幕会显示__main__,这表示运行lib.py时,lib module的__name__属性的值是__main__
> 
> 当你运行call.py时,屏幕会显示
> --------------
> hello
> lib
> --------------
> 这时,由于lib是又call.py调用的,因此其__name__属性的值就变成文件名了
> 
> 最后再来看为什么要有
> if __name__ == "__main__" :
> 
> 很明显,call.py要用的是lib的func函数,它并不想让lib执行print
> __name__。但是lib不管三七二十一,import之后就运行。这并不是我们所希望的,但是让lib能自动运行又是必须的(比如说测试),因此你可以用
> if __name__ == "__main__" :
> 将要运行的程序同不运行的程序隔离开来。当你直接运行lib.py的时候,lib的__name__值是__main__,因此这段代码就运行了,当你运行其它程序调用lib的时候,lib的__name__属性是lib,因此下面这段代码就不运行了。
> 
> 我想这样解释应该比较清楚了吧。
> 
> 
> On 7/6/05, jam.zheng <jam.zheng at achievo.com> wrote:
> >
> >
> > 请问各位大侠:
> >          我在很多python源码看到有如下代码:
> >                        if __name__ == '__main__':
> >                              fun()
> > 请问这是什么意思?请高手赐教!
> >
> >
> >
> > Best regards,
> > * * * * * * *
> > Jam Zheng
> > Engineer of Software Section 1
> > Achievo China
> > Phone: (86-755) 2603-0128 X203
> > Fax:  (86-755) 2603-0138
> >
> > _______________________________________________
> > python-chinese list
> > python-chinese at lists.python.cn
> > http://python.cn/mailman/listinfo/python-chinese
> >
> >
> >
> 
> _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
> 
> 
> 


-- 
I like python! 
My Donews Blog: http://www.donews.net/limodou
New Google Maillist: http://groups-beta.google.com/group/python-cn

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号