问题:从子目录导入文件?
我的档案tester.py
位于/project
。
/project
有一个名为的子目录lib
,文件名为BoxTime.py
:
/project/tester.py
/project/lib/BoxTime.py
我想导入BoxTime
的tester
。我已经试过了:
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()
I have a file called tester.py
, located on /project
.
/project
has a subdirectory called lib
, with a file called BoxTime.py
:
/project/tester.py
/project/lib/BoxTime.py
I want to import BoxTime
from tester
. I have tried this:
import lib.BoxTime
Which resulted:
Traceback (most recent call last):
File "./tester.py", line 3, in <module>
import lib.BoxTime
ImportError: No module named lib.BoxTime
Any ideas how to import BoxTime
from the subdirectory?
EDIT
The __init__.py
was the problem, but don’t forget to refer to BoxTime
as lib.BoxTime
, or use:
import lib.BoxTime as BT
...
BT.bt_function()
回答 0
回答 1
后来,在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!
- Create a subdirectory named
lib
.
- Create an empty file named
lib\__init__.py
.
In lib\BoxTime.py
, write a function foo()
like this:
def foo():
print "foo!"
In your client code in the directory above lib
, write:
from lib import BoxTime
BoxTime.foo()
Run your client code. You will get:
foo!
Much later — in linux, it would look like this:
% 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!
回答 2
您可以尝试将其插入sys.path
:
sys.path.insert(0, './lib')
import BoxTime
You can try inserting it in sys.path
:
sys.path.insert(0, './lib')
import BoxTime
回答 3
我写下来是因为每个人似乎都建议您必须创建lib
目录。
您无需命名子目录lib
。你能说出它anything
提供你把一个__init__.py
进去。
您可以通过在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)
I am writing this down because everyone seems to suggest that you have to create a lib
directory.
You don’t need to name your sub-directory lib
. You can name it anything
provided you put an __init__.py
into it.
You can do that by entering the following command in a linux shell:
$ touch anything/__init__.py
So now you have this structure:
$ ls anything/
__init__.py
mylib.py
$ ls
main.py
Then you can import mylib
into main.py
like this:
from anything import mylib
mylib.myfun()
You can also import functions and classes like this:
from anything.mylib import MyClass
from anything.mylib import myfun
instance = MyClass()
result = myfun()
Any variable function or class you place inside __init__.py
can also be accessed:
import anything
print(anything.myvar)
Or like this:
from anything import myvar
print(myvar)
回答 4
您的lib目录是否包含__init__.py
文件?
Python用于__init__.py
确定目录是否为模块。
Does your lib directory contain a __init__.py
file?
Python uses __init__.py
to determine if a directory is a module.
回答 5
尝试import .lib.BoxTime
。有关更多信息,请参阅PEP 328中的相对导入。
Try import .lib.BoxTime
. For more information read about relative import in PEP 328.
回答 6
我这样做基本上涵盖了所有情况(确保您__init__.py
在relative / path / to / your / lib / folder中):
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()
I do this which basically covers all cases (make sure you have __init__.py
in relative/path/to/your/lib/folder):
import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/relative/path/to/your/lib/folder")
import someFileNameWhichIsInTheFolder
...
somefile.foo()
Example:
You have in your project folder:
/root/myproject/app.py
You have in another project folder:
/root/anotherproject/utils.py
/root/anotherproject/__init__.py
You want to use /root/anotherproject/utils.py
and call foo function which is in it.
So you write in app.py:
import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/../anotherproject")
import utils
utils.foo()
回答 7
__init__.py
在子目录/ lib中创建一个空文件 。并在主代码的开头添加
from __future__ import absolute_import
然后
import lib.BoxTime as BT
...
BT.bt_function()
或更好
from lib.BoxTime import bt_function
...
bt_function()
Create an empty file __init__.py
in subdirectory /lib.
And add at the begin of main code
from __future__ import absolute_import
then
import lib.BoxTime as BT
...
BT.bt_function()
or better
from lib.BoxTime import bt_function
...
bt_function()
回答 8
只是这些答案的补充。
如果要从所有子目录导入所有文件,可以将其添加到文件的根目录。
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
换句话说,此代码将抽象出文件来自哪个目录。
Just an addition to these answers.
If you want to import all files from all subdirectories, you can add this to the root of your file.
import sys, os
sys.path.extend([f'./{name}' for name in os.listdir(".") if os.path.isdir(name)])
And then you can simply import files from the subdirectories just as if these files are inside the current directory.
Working example
If I have the following directory with subdirectories in my project…
.
├── a.py
├── b.py
├── c.py
├── subdirectory_a
│ ├── d.py
│ └── e.py
├── subdirectory_b
│ └── f.py
├── subdirectory_c
│ └── g.py
└── subdirectory_d
└── h.py
I can put the following code inside my a.py
file
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
In other words, this code will abstract from which directory the file is coming from.
回答 9
/project/tester.py
/project/lib/BoxTime.py
下一__init__.py
行创建空白文件,直到找到文件
/project/lib/somefolder/BoxTime.py
#lib
-需求有两个项目__init__.py
,一个名为somefolder的目录
#somefolder
有两个项目boxtime.py
,__init__.py
/project/tester.py
/project/lib/BoxTime.py
create blank file __init__.py
down the line till you reach the file
/project/lib/somefolder/BoxTime.py
#lib
— needs has two items one __init__.py
and a directory named somefolder
#somefolder
has two items boxtime.py
and __init__.py
回答 10
尝试这个:
from lib import BoxTime
try this:
from lib import BoxTime