Import a file from a subdirectory?
我有一个叫
1 2 | /project/tester.py /project/lib/BoxTime.py |
我想从
1 | import lib.BoxTime |
结果:
1 2 3 4 | Traceback (most recent call last): File"./tester.py", line 3, in <module> import lib.BoxTime ImportError: No module named lib.BoxTime |
有没有办法从子目录导入
编辑
问题出在
1 2 3 | import lib.BoxTime as BT ... BT.bt_function() |
查看包文档(第6.4节):http://docs.python.org/tutorial/modules.html
简而言之,您需要放置一个名为
1 | __init__.py |
在"lib"目录中。
- 创建名为
lib 的子目录。 - 创建一个名为
lib\__init__.py 的空文件。 在
lib\BoxTime.py 中,编写一个函数foo() 如下:1
2def foo():
print"foo!"在您的客户机代码中,在
lib 上方的目录中,写下:1
2from lib import BoxTime
BoxTime.foo()运行客户端代码。你会得到:
1foo!
很晚——在Linux中,它看起来像这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | % 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! |
您可以尝试在
1 2 | sys.path.insert(0, './lib') import BoxTime |
lib目录是否包含
python使用
试试
我写下来是因为每个人似乎都建议您必须创建一个
您不需要将子目录命名为
您可以通过在Linux shell中输入以下命令来完成此操作:
1 | $ touch anything/__init__.py |
现在你有了这样的结构:
1 2 3 4 5 6 | $ ls anything/ __init__.py mylib.py $ ls main.py |
然后您可以将
1 2 3 | from anything import mylib mylib.myfun() |
您还可以导入如下函数和类:
1 2 3 4 5 | from anything.mylib import MyClass from anything.mylib import myfun instance = MyClass() result = myfun() |
您放置在
1 2 3 | import anything print(anything.myvar) |
或者像这样:
1 2 3 | from anything import myvar print(myvar) |
我这样做基本上涵盖了所有情况(确保在relative/path/to/your/lib/folder中有EDOCX1[1]):
1 2 3 4 5 | import sys, os sys.path.append(os.path.dirname(os.path.realpath(__file__)) +"/relative/path/to/your/lib/folder") import someFileNameWhichIsInTheFolder ... somefile.foo() |
例子:您的项目文件夹中有:
1 | /root/myproject/app.py |
您在另一个项目文件夹中:
1 2 | /root/anotherproject/utils.py /root/anotherproject/__init__.py |
您要使用
所以你在app.py中写道:
1 2 3 4 5 | import sys, os sys.path.append(os.path.dirname(os.path.realpath(__file__)) +"/../anotherproject") import utils utils.foo() |
在子目录/lib中创建一个空文件
1 | from __future__ import absolute_import |
然后
1 2 3 | import lib.BoxTime as BT ... BT.bt_function() |
或更好
1 2 3 | from lib.BoxTime import bt_function ... bt_function() |
试试这个:
沿行创建空白文件