Ada*_*tan 415 python module python-import subdirectory
我有一个名为的文件tester.py,位于/project.
/project有一个名为的子目录lib,其文件名为BoxTime.py:
/project/tester.py
/project/lib/BoxTime.py
Run Code Online (Sandbox Code Playgroud)
我想导入BoxTime的tester.我试过这个:
import lib.BoxTime
Run Code Online (Sandbox Code Playgroud)
结果如下:
Traceback (most recent call last):
File "./tester.py", line 3, in <module>
import lib.BoxTime
ImportError: No module named lib.BoxTime
Run Code Online (Sandbox Code Playgroud)
任何想法如何BoxTime从子目录导入?
编辑
该__init__.py是问题,但不要忘了提及BoxTime作为lib.BoxTime,或使用:
import lib.BoxTime as BT
...
BT.bt_function()
Run Code Online (Sandbox Code Playgroud)
Gre*_*reg 497
请查看Packages文档(第6.4节):http://docs.python.org/tutorial/modules.html
简而言之,您需要将一个空白文件命名为
__init__.py
Run Code Online (Sandbox Code Playgroud)
在"lib"目录中.
hug*_*own 152
lib.lib\__init__.py.在lib\BoxTime.py,写一个foo()这样的函数:
def foo():
print "foo!"
Run Code Online (Sandbox Code Playgroud)在上面目录中的客户端代码中lib,写下:
from lib import BoxTime
BoxTime.foo()
Run Code Online (Sandbox Code Playgroud)运行您的客户端代码.你会得到:
foo!
Run Code Online (Sandbox Code Playgroud)很久以后 - 在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!
Run Code Online (Sandbox Code Playgroud)
Kre*_*mir 61
您可以尝试将其插入sys.path:
sys.path.insert(0, './lib')
import BoxTime
Run Code Online (Sandbox Code Playgroud)
nur*_*tin 25
我写这篇文章是因为每个人似乎都建议你必须创建一个lib目录.
您无需为子目录命名lib.你可以anything把__init__.py它命名为它.
您可以通过在linux shell中输入以下命令来实现:
$ touch anything/__init__.py
Run Code Online (Sandbox Code Playgroud)
所以现在你有了这个结构:
$ ls anything/
__init__.py
mylib.py
$ ls
main.py
Run Code Online (Sandbox Code Playgroud)
然后,你可以导入mylib到main.py这样的:
from anything import mylib
mylib.myfun()
Run Code Online (Sandbox Code Playgroud)
您还可以导入这样的函数和类:
from anything.mylib import MyClass
from anything.mylib import myfun
instance = MyClass()
result = myfun()
Run Code Online (Sandbox Code Playgroud)
您__init__.py也可以访问放在里面的任何变量函数或类:
import anything
print(anything.myvar)
Run Code Online (Sandbox Code Playgroud)
或者像这样:
from anything import myvar
print(myvar)
Run Code Online (Sandbox Code Playgroud)
我这样做基本上涵盖了所有情况(确保你__init__.py在relative/path/to/your/lib /文件夹中):
import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/relative/path/to/your/lib/folder")
import someFileNameWhichIsInTheFolder
...
somefile.foo()
Run Code Online (Sandbox Code Playgroud)
示例:
您在项目文件夹中:
/root/myproject/app.py
Run Code Online (Sandbox Code Playgroud)
你有另一个项目文件夹:
/root/anotherproject/utils.py
/root/anotherproject/__init__.py
Run Code Online (Sandbox Code Playgroud)
你想使用/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()
Run Code Online (Sandbox Code Playgroud)
小智 6
__init__.py在子目录 /lib 中创建一个空文件 。并在主代码的开头添加
from __future__ import absolute_import
Run Code Online (Sandbox Code Playgroud)
然后
import lib.BoxTime as BT
...
BT.bt_function()
Run Code Online (Sandbox Code Playgroud)
或更好
from lib.BoxTime import bt_function
...
bt_function()
Run Code Online (Sandbox Code Playgroud)
只是对这些答案的补充。
如果要从所有子目录导入所有文件,可以将其添加到文件的根目录中。
import sys, os
sys.path.extend([f'./{name}' for name in os.listdir(".") if os.path.isdir(name)])
Run Code Online (Sandbox Code Playgroud)
然后您可以简单地从子目录导入文件,就像这些文件在当前目录中一样。
如果我的项目中有以下带有子目录的目录...
.
??? a.py
??? b.py
??? c.py
??? subdirectory_a
? ??? d.py
? ??? e.py
??? subdirectory_b
? ??? f.py
??? subdirectory_c
? ??? g.py
??? subdirectory_d
??? h.py
Run Code Online (Sandbox Code Playgroud)
我可以将以下代码放入我的a.py文件中
import sys, os
sys.path.extend([f'./{name}' for name in os.listdir(".") if os.path.isdir(name)])
# And then you can import files just as if these files are inside the current directory
import b
import c
import d
import e
import f
import g
import h
Run Code Online (Sandbox Code Playgroud)
换句话说,这段代码将从文件来自哪个目录中抽象出来。