我有一个名为test .py的文件,位于/project上。
/project有一个子目录叫lib,里面有一个文件叫BoxTime.py:
/project/tester.py
/project/lib/BoxTime.py
我想从测试器导入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 ?
EDIT
__init__.py是问题所在,但不要忘记将BoxTime引用为lib。BoxTime,或使用:
import lib.BoxTime as BT
...
BT.bt_function()
创建名为lib的子目录。
创建一个名为lib\__init__.py的空文件。
在lib\BoxTime.py中,像这样写一个函数foo():
def foo ():
打印“foo”!
在lib上面目录下的客户端代码中,写:
从lib导入BoxTime
BoxTime.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!
包括完整的示例
这基本上涵盖了所有情况(确保你有__init__.py相对/path/到/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()
例子:
你的项目文件夹中有:
/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()
只是对这些答案的补充。
如果您想从所有子目录导入所有文件,可以将其添加到文件的根目录。
import sys, os
sys.path.extend([f'./{name}' for name in os.listdir(".") if os.path.isdir(name)])
然后,您可以简单地从子目录导入文件,就像这些文件在当前目录中一样。
工作示例
如果我的项目中有以下目录和子目录…
.
├── a.py
├── b.py
├── c.py
├── subdirectory_a
│ ├── d.py
│ └── e.py
├── subdirectory_b
│ └── f.py
├── subdirectory_c
│ └── g.py
└── subdirectory_d
└── h.py
我可以把下面的代码放在我的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
换句话说,这段代码将抽象文件来自的目录。
创建名为lib的子目录。
创建一个名为lib\__init__.py的空文件。
在lib\BoxTime.py中,像这样写一个函数foo():
def foo ():
打印“foo”!
在lib上面目录下的客户端代码中,写:
从lib导入BoxTime
BoxTime.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!