http://techtrace.org/?p=1347
http://blog.chinaunix.net/uid-29089809-id-4044667.html
同一文件夹情况下
import a
Python 会自动从 sys.path 路径列表里的所有路径里寻找你要 import 的模块,这个路径列表可以通过在终端里输入以下命令查看:
import sys sys.path如果要调用其他路径的文件,可以先在上述列表中加入新的路径,以你提到的情况为例:
import sys sys.path.insert(0, '/') import test一般一个项目的所有文件应该在同一个项目文件夹中吧,此时有其他解决办法比如在项目的下级目录里放置 __init__.py 文件,然后用 from 文件夹 import 文件名 的方式来引入模块。
============================
如果你的调用文件离被调用的test.py远到八竿子打不着, 可以在sys.path中append "C:/"路径 (使得import过程中的PYATHONPATH能找到test.py这个文件), 再import test.
或者还有一个方法, 用imp模块的load_source或者find_module+load_module方法动态加载模块, 具体看这http://docs.python.org/library/imp.html =================================
a.funcA()
不同文件夹的话要
import sys
sys.path.insert('a.py所在的路径')
import a
a.funcA()
大概是这样
==============================
win下面cmd当前目录上运行python交互的时候,
当前目录如果是个python包,要在当前交互引入它,
也需要 sys.path.append(".."),
不过我个人的做法通常是sys.path.insert(0,"..")
[code]
c:/py25>cd sub
c:/py25>python
>>>#import sub #这里提示找不到
>>>import sys
>>>sys.path.insert(0,'..') #或者sys.path.append("..")
>>>import sub #这里引入成功
[/code]
貌似是大蛇的当前目录是"能识儿子是儿子不识自己是父亲"的,
也就是要引入当前包的父包的话,要sys.path.insert(0,'../..')了...
=====================================
在Python 中引用是非常简单的事情,这里需要清楚三个概念就可以了包、模块、类。类这个就不用说了。
模块对应的是一个.py 文件,那么module_name 就是这个文件去掉.py 之后的文件名,py 文件中可以直接定义一些变量、函数、类。
那么包我们可以看作一个包含__init__.py 和一系列.py 文件的文件夹,这样做的目的是为了区别包和普通字符串。
import module_name
from package_name import module_name
from package_name import *
那么如何import 时,python 解释器如何才能找到该模块放置的文件位置呢?python 寻找模块的优先级如下:
1、 当前文件目录
2、 环境变量PYTHONPATH
3、 sys.path(list 类型)
sys.path 是list 类型,我们可以通过insert(), append() 方法来增加模块导入的搜索路径,如:
import sys
path = “……” # 需要增加的路径
sys.path.insert(0, path)
在import模块时,该模块的顶层代码将会被执行一次。如果该模块被import多次,例如import A, import B.其中B模块本身也有import A,那么只在第一次被import的时候顶层代码会被执行。
模块能像包含函数定义一样,可包含一些可执行语句。这些可执行语句通常用来进行模块的初始化工作。这些语句只在模块第一次被导入时被执行。这非常重要,有些人以为这些语句会多次导入多次执行,其实不然。
模块在被导入执行时,python解释器为加快程序的启动速度,会在与模块文件同一目录下生成.pyc文件。我们知道python是解释性的脚本语言,而.pyc是经过编译后的字节码,这一工作会自动完成,而无需程序员手动执行。
什么时候你应该使用 from module import?
除了这些情况,剩下的只是风格问题了,你会看到用两种方式编写的 Python 代码。
尽量少用 from module import * ,因为判定一个特殊的函数或属性是从哪来的有些困难,并且会造成调试和重构都更困难。 |
在创建许许多多模块后,我们可能希望将某些功能相近的文件组织在同一文件夹下,这里就需要运用包的概念了。包对应于文件夹,使用包的方式跟模块也类似,唯一需要注意的是,当文件夹当作包使用时,文件夹需要包含__init__.py文件,主要是为了避免将文件夹名当作普通的字符串。__init__.py的内容可以为空,一般用来进行包的某些初始化工作或者设置__all__值,__all__是在from package-name import *这语句使用的,全部导出定义过的模块。
那么我们平常新建文件的时候,都是建一个.py文件(类似java,但是python不用建立类,是以模块为载体)至于怎样组织包就要功能需要了
在C/C++/Java中,main是程序执行的起点,Python中,也有类似的运行机制,但方式却截然不同:Python使用缩进对齐组织代码的执行,所有没有缩进的代码(非函数定义和类定义),都会在载入时自动执行,这些代码,可以认为是Python的main函数。
每个文件(模块)都可以任意写一些没有缩进的代码,并且在载入时自动执行,为了区分主执行文件还是被调用的文件,Python引入了一个变量__name__,当文件是被调用时,__name__的值为模块名,当文件被执行时,__name__为'__main__'。这个特性,为测试驱动开发提供了极好的支持,我们可以在每个模块中写上测试代码,这些测试代码仅当模块被Python直接执行时才会运行,代码和测试完美的结合在一起。
典型的Python文件结构:
python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的路径。 下面将具体介绍几种常用情况: (1)主程序与模块程序在同一目录下: 如下面程序结构: `-- src |-- mod1.py `-- test1.py 若在程序test1.py中导入模块mod1, 则直接使用import mod1或from mod1 import *; (2)主程序所在目录是模块所在目录的父(或祖辈)目录 如下面程序结构: `-- src |-- mod1.py |-- mod2 | `-- mod2.py `-- test1.py 若在程序test1.py中导入模块mod2, 需要在mod2文件夹中建立空文件__init__.py文件(也可以在该文件中自定义输出模块接口); 然后使用 from mod2.mod2 import * 或import mod2.mod2. (3)主程序导入上层目录中模块或其他目录(平级)下的模块 如下面程序结构: `-- src |-- mod1.py |-- mod2 | `-- mod2.py |-- sub | `-- test2.py `-- test1.py 若在程序test2.py中导入模块mod1和mod2。首先需要在mod2下建立__init__.py文件(同(2)),src下不必建立该文件。然后调用方式如下: 下面程序执行方式均在程序文件所在目录下执行,如test2.py是在cd sub;之后执行python test2.py 而test1.py是在cd src;之后执行python test1.py; 不保证在src目录下执行python sub/test2.py成功。 import sys sys.path.append("..") import mod1 import mod2.mod2 (4)从(3)可以看出,导入模块关键是能够根据sys.path环境变量的值,找到具体模块的路径。这里仅介绍上面三种简单情况。
========================================================================================
文件1:myclass.py