在python中如何导入两个不同目录下python导入自定义文件的模块呢

trackbacks-0
上网查了下资料和自己实验了下,有几个方法:
1.如果导入的模块和主程序在同个目录下,直接import就行了
2.如果导入的模块是在主程序所在目录的子目录下,可以在子目录中增加一个空白的__init__.py文件,该文件使得python解释器将子目录整个也当成一个模块,然后直接通过&import 子目录.模块&导入即可。
3.如果导入的模块是在主程序所在目录的父目录下,则要通过修改path来解决,有两种方法:
(1)通过&import sys,sys.path.append('父目录的路径')&来改变,这种方法属于一次性的,只对当前的python解释器进程有效,关掉python重启后就失效了。
(2)直接修改环境变量:在windows中是 & set 变量=&路径& && 例如:set PYTHONPATH=&C:\test\...& 查看是否设置成功用echo %PYTHONPATH%,而且进到python解释器中查看sys.path,会发现已经有了新增加的路径了。这 种方式是永久的,一次设置以后一直都有效。在linux中是 "export 变量=&路径& &,查看是" echo $变量 "
通过修改path是通用的方法,因为python解释器就是通过sys.path去一个地方一个地方的寻找模块的。
阅读(...) 评论()python在不同层级目录import模块的方法
作者:运维之路
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了python 在不同层级目录import 模块的方法,需要的朋友可以参考下
使用python进行程序编写时,经常会使用第三方模块包。这种包我们可以通过python setup install 进行安装后,通过import XXX或from XXX import yyy 进行导入。不过如果是自己遍写的依赖包,又不想安装到python的相应目录,可以放到本目录里进行import进行调用;为了更清晰的理清程序之间的关系,例如我们会把这种包放到lib目录再调用。本篇就针对常见的模块调用方法汇总下。
一、同级目录下的调有
程序结构如下:
&&& |-- mod1.py
&&& |-- test1.py
若在程序test1.py中导入模块mod1, 则直接使用
import mod1
from mod1 import *;
二、调用子目录下的模块
程序结构如下:
&&& |-- mod1.py
&&& |-- lib
&&& |&&& |-- mod2.py
&&& |-- test1.py
这时看到test1.py和lib目录(即mod2.py的父级目录),如果想在程序test1.py中导入模块mod2.py ,可以在lib件夹中建立空文件__init__.py文件(也可以在该文件中自定义输出模块接口),然后使用:
from lib.mod2 import *
import lib.mod2.
三、调用上级目录下的文件
程序结构如下:
&&& |-- mod1.py
&&& |-- lib
&&& |&&& |-- mod2.py
&&& |-- sub
&&& |&&& |-- test2.py
这里想要实现test2.py调用mod1.py和mod2.py ,做法是我们先跳到src目录下面,直接可以调用mod1,然后在lib上当下建一个空文件__init__.py ,就可以像第二步调用子目录下的模块一样,通过import& lib.mod2进行调用了。具体代码如下:
import sys
sys.path.append("..")
import mod1
import mod2.mod2
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具如何发布自定义的Python模块_Linux编程_Linux公社-Linux系统门户网站
你好,游客
如何发布自定义的Python模块
来源:oschina.net&
作者:haigou20
php开发中,我们定义好了一个公用函数,则会将代码放在公用的文件中,需要用到的时候,使用require或者include函数包含这个公用的文件,即可在程序中实现可重用。接下来看看python中如何操作
系统环境:window xp sp3,python2.7
在D盘pydemo目录下创建一个nester目录(此目录为举例说明,属自定义)
在目录中添加两个python程序文件:nester.py和setup.py
nester.py 模块的程序文件,代码如下(实现递归遍历数组):
def print_lol(arr):&for row in arr:& if(isinstance(row , list)):& &print_lol(row)& else:& &print row
setup.py 保存模块的安装信息,包含模块名称,模块开发者等信息,代码如下:
from distutils.core import setup
setup (&name = 'nester',&version = '1.0.1',&py_modules = ['nester'],&author = 'ken.wong',&author_email = '',&description = 'Module demo',)
name和py_modules这两个参数一定要与nester.py文件名相同,否则发布安装时会发出模块文件找不到的错误
通过命令行,进入nester目录(D:/pydemo/nester),依次输入下图中红色框的命令
发布模块,但还不能在程序中被调用,还需要安装,接着看
See,安装完成,在python环境下产生一个nester-1.0.1-py2.7.egg-info文件,有点类似php扩展的.dll(windows环境下的)
现在可以在程序中使用刚才安装的nester模块
import nester
movies = ['a','b',['c1','c2']]
nester.print_lol(movies)
这里需要注意一个问题,很多新手会这样调用:
print_lol(movies)
系统会发出这样的一个错误信息:NameError: name 'print_lol' is not defined
原因是当模块创建以后,系统自动创建一个与模块名称相同的命名空间(nester),并将函数放在命名空间中,简单的通过print_lol调用,自然无法找到函数,正确的方法:
nester.print_lol(movies)
直接把命名空间带上即可。
推荐阅读:
Python之Matplotlib画图方法
Python:使用matplotlib绘制图表
相关资讯 & & &
& (02/25/:04)
& (01/02/:19)
& (08/08/:12)
& (02/16/:41)
& (12/13/:55)
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
匿名 发表于 linux咋导入啊,都在说windowsPython中导入模块或包语句 - Python - 伯乐在线
& Python中导入模块或包语句
这篇文章讨论了Python的from &module& import *和from &package& import *,它们怎么执行以及为什么使用这种语法(也许)是一个坏主意。
从一个模块导入全部
from &module& import * means意味着“我希望能访问&module&中我有权限访问的全部名称”。例如以下代码something.py:
# something.py
public_variable = 42
_private_variable = 141
def public_function():
print("I'm a public function! yay!")
def _private_function():
print("Ain't nobody accessing me from another module...usually")
class PublicClass(object):
class _WeirdClass(object):
12345678910111213141516
# something.py&public_variable = 42_private_variable = 141&def public_function():&&&&print("I'm a public function! yay!")&def _private_function():&&&&print("Ain't nobody accessing me from another module...usually")&class PublicClass(object):&&&&pass&class _WeirdClass(object):&&&&pass
在Python解释器中,我们可以执行from something import *,然后看到如下的内容:
&&& from something import *
&&& public_variable
&&& _private_variable
NameError: name '_private_variable' is not defined
&&& public_function()
"I'm a public function! yay!"
&&& _private_function()
NameError: name '_private_function' is not defined
&&& c = PublicClass()
&something.PublicClass object at ...&
&&& c = _WeirdClass()
NameError: name '_WeirdClass' is not defined
1234567891011121314151617
&&& from something import *&&& public_variable42&&& _private_variable...NameError: name '_private_variable' is not defined&&& public_function()"I'm a public function! yay!"&&& _private_function()...NameError: name '_private_function' is not defined&&& c = PublicClass()&&& c&something.PublicClass object at ...&&&& c = _WeirdClass()...NameError: name '_WeirdClass' is not defined
from something import *从something中导入了除了以_开头名称外的其他所有名称,按照规范,_开始的名称是私有的所以未被导入。
嗯,不是特别糟!还有什么?
上面没提到__all__是什么。__all__是一个字符串列表,指定了当from &module& import *被使用时,模块(或者如后文会提到的包)中的哪些符号会被导出。如果我们不定义__all__(我们在上面的something.py就没定义),import *默认的导入方式是导入除了下划线(_)开头的所有名称。再说一次,编程惯例上下划线表示一个符号是私有的,不导入是合理的。让我们来看看在something.py中定义我们自己的__all__会发生什么。
# something.py
__all__ = ['_private_variable', 'PublicClass']
# The rest is the same as before
public_variable = 42
_private_variable = 141
def public_function():
print("I'm a public function! yay!")
def _private_function():
print("Ain't nobody accessing me from another module...usually")
class PublicClass(object):
class _WeirdClass(object):
1234567891011121314151617181920
# something.py&__all__ = ['_private_variable', 'PublicClass']&# The rest is the same as before&public_variable = 42_private_variable = 141&def public_function():&&&&print("I'm a public function! yay!")&def _private_function():&&&&print("Ain't nobody accessing me from another module...usually")&class PublicClass(object):&&&&pass&class _WeirdClass(object):&&&&pass
现在,我们期望from something import *只会导入_private_variable和PublicClass:
&&& from something import *
&&& public_variable
&&& _private_variable
NameError: name '_private_variable' is not defined
&&& public_function()
"I'm a public function! yay!"
&&& _private_function()
NameError: name '_private_function' is not defined
&&& c = PublicClass()
&something.PublicClass object at ...&
&&& c = _WeirdClass()
NameError: name '_WeirdClass' is not defined
1234567891011121314151617
&&& from something import *&&& public_variable42&&& _private_variable...NameError: name '_private_variable' is not defined&&& public_function()"I'm a public function! yay!"&&& _private_function()...NameError: name '_private_function' is not defined&&& c = PublicClass()&&& c&something.PublicClass object at ...&&&& c = _WeirdClass()...NameError: name '_WeirdClass' is not defined
包是怎样的呢?
当从一个包中导入全部时,__all__的做法和模块基本一样,不过它处理的是包中的模块(而不是把模块中的名都导入)。所以当我们使用from &package& import *.时__all__说明了所有需要被导入当前命名空间的模块。
不同之处在于,如果你在一个包的__init__.py里面没有声明__all__,from &package& import *语句不会导入任何东西(这个说法也不全对,正确的说法)
但是,这有什么不好?
继续读之前,在你的Python解释器中,执行import this,再读一遍(在你孩子每晚睡前也要读给他们)。
明确比含糊要好。
from &module& import * 是不明确的。它没告诉我们我们正在导入什么或者我们把什么带入当前命名空间了。更好的做法是显式地导入我们需要的全部名称。这种方式下,读者(非常可能是未来的你自己)就不会困惑于你代码中使用的一个变量/方法/类/其他东西是哪儿来的,这也告诉了我们下一点:
可读性很重要
即使你需要导入很多东西,一个一个显式地导入也更清楚。使用:
from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text,
LEFT, DISABLED, NORMAL, RIDGE, END)
from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text, &&&&LEFT, DISABLED, NORMAL, RIDGE, END)
你现在就能明确知道你的命名空间里有什么,使用ctrl+f能很快地告诉你它们是哪儿来的。
同时,你还总是要承担模块/包作者更改list内容(加/减东西)的风险。也就是下面两者之一:
作者从__all__里删除了一个字符串。如果你的代码使用了那个名字,你的代码就会报出NameError的错误,并且很难发现为什么。
作者在__all__里加入了很多东西。你也许不需要这些增加的内容,所以你只是让这些你不关心的东西占满了你的命名空间。他们甚至在你不注意的时候会替代其他同名内容。
当然,有时候从模块或者包中导入全部内容是有用的。不过,这么做之前三思。从我的经验来看,这么做通常只是因为懒。
关于作者:
可能感兴趣的话题
问一下这个用的是什么编译器?
关于 Python 频道
Python频道分享 Python 开发技术、相关的行业动态。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2016 伯乐在线

我要回帖

更多关于 python 自定义模块 的文章

 

随机推荐