从子目录导入文件?

我有一个名为tester.py的文件,位于/project

/project有一个子目录lib ,文件名为BoxTime.py

/project/tester.py
/project/lib/BoxTime.py

我想从tester导入BoxTime 。 我已经试过了:

import lib.BoxTime

结果是:

Traceback (most recent call last):
  File "./tester.py", line 3, in <module>
    import lib.BoxTime
ImportError: No module named lib.BoxTime

有什么想法如何从子目录导入BoxTime

编辑

__init__.py是问题所在,但不要忘记将BoxTime称为lib.BoxTime ,或使用:

import lib.BoxTime as BT
...
BT.bt_function()

#1楼

在此处查看Packages文档(第6.4节): http : //docs.python.org/tutorial/modules.html

简而言之,您需要放置一个名为

__init__.py

在“ lib”目录中。


#2楼

尝试import .lib.BoxTime 。 有关更多信息,请参阅PEP 328中的相对导入。


#3楼

您的lib目录是否包含__init__.py文件?

Python使用__init__.py来确定目录是否为模块。


#4楼

  • 创建一个名为lib的子目录。
  • 创建一个名为lib\\__init__.py的空文件。
  • lib\\BoxTime.py ,编写一个函数foo()如下所示:

     def foo(): print "foo!" 
  • lib上方目录中的客户机代码中,编写:

     from lib import BoxTime BoxTime.foo() 
  • 运行您的客户端代码。 你会得到:

     foo! 

后来,在Linux中,它看起来像这样:

% cd ~/tmp
% mkdir lib
% touch lib/__init__.py
% cat > lib/BoxTime.py << EOF
heredoc> def foo():
heredoc>     print "foo!"
heredoc> EOF
% tree lib
lib
├── BoxTime.py
└── __init__.py

0 directories, 2 files
% python 
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from lib import BoxTime
>>> BoxTime.foo()
foo!

#5楼

您可以尝试将其插入sys.path

sys.path.insert(0, './lib')
import BoxTime

#6楼

尝试这个:

from lib import BoxTime


#7楼

我这样做基本上涵盖了所有情况(确保相对/路径/到/您的/ lib /文件夹中有__init__.py ):

import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/relative/path/to/your/lib/folder")
import someFileNameWhichIsInTheFolder
...
somefile.foo()


例:
您在项目文件夹中:

/root/myproject/app.py

您在另一个项目文件夹中:

/root/anotherproject/utils.py
/root/anotherproject/__init__.py

您想使用/root/anotherproject/utils.py并调用其中的foo函数。

因此,您在app.py中编写:

import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/../anotherproject")
import utils

utils.foo()

#8楼

在/ lib子目录中创建一个空文件__init__.py 。 并在主代码的开头添加

from __future__ import absolute_import 

然后

import lib.BoxTime as BT
...
BT.bt_function()

或更好

from lib.BoxTime import bt_function
...
bt_function()

#9楼

/project/tester.py

/project/lib/BoxTime.py

在该行下创建空白文件__init__.py ,直到找到该文件

/project/lib/somefolder/BoxTime.py

#lib需要两个项目,一个是__init__.py ,一个名为somefolder的目录#somefolder有两个项目, boxtime.py__init__.py


#10楼

我写下来是因为每个人似乎都建议您必须创建一个lib目录。

您无需命名子目录lib 。 只要将__init__.py放入其中,就可以命名anything

您可以通过在Linux shell中输入以下命令来做到这一点:

$ touch anything/__init__.py 

所以现在您有了以下结构:

$ ls anything/
__init__.py
mylib.py

$ ls
main.py

然后可以将mylib导入到main.py如下所示:

from anything import mylib 

mylib.myfun()

您也可以像这样导入函数和类:

from anything.mylib import MyClass
from anything.mylib import myfun

instance = MyClass()
result = myfun()

您放置在__init__.py任何变量函数或类也可以访问:

import anything

print(anything.myvar)

或像这样:

from anything import myvar

print(myvar)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值