Python: 从另一个位置导入文件
Python: Importing file from another location
我不确定我哪里出错了,我已经尝试了其他问题中列出的一堆方法,所以我会重新询问以防我遗漏了什么。
我有以下结构:
|-bin/
-file.py
|-unittests/
-__init__.py
|-test_bin/
-__init__.py
-test_file.py
我在 test_file.py
中尝试了以下方法但无济于事:
1) Import Error: No module named bin.file
from bin.file import *
2) Import Error: No module named bin.file
import sys
from os import path
sys.path.append(path.dirname(path.dirname(path.abspath(__file__))))
from bin.file import *
3) ValueError: Attempted relative import in non-package
from ...bin.file import *
我使用的命令是python test_file.py
Python 导入有点奇怪。首先,要解决您的问题 - 添加一个名为 __init__.py
的空文件到您的 bin 目录。现在来解释为什么-
Python 构建搜索路径。它使用环境变量 PYTHONPATH 中的所有目录,加上 site-packages
用于您的 virtualenv 或您的基本解释器。一般运行ning python
也会把当前工作目录添加到PYTHONPATH中。
因此可以导入其中一个目录中的任何 .py
文件。但是对于模块,它不会查看每个目录。相反,它只计算包含那个魔法 __init__.py
文件的目录。所以你会在那里看到 bin.py
.. 但不是 bin/bin.py
,直到你添加 __init__.py
文件。
(这适用于一直向下的嵌套目录)。
看看你的问题,这可能仍然是个问题 - 如果你从 test_file 所在的底部目录 运行ning 你的命令,你的根目录不在搜索中无论如何都要看到 bin
的路径。所以你必须从根 python unittests/test_bin/test_file.py
执行 PYTHONPATH=../..:$PYTHONPATH python test_file.py
或 运行 命令
要使导入工作,您需要位于项目的根目录下。
但是,您可以在包的根目录添加一个 setup.py 文件,这样您就可以从任何地方导入您的函数(见下文):
Setup.py :
from setuptools import setup
setup(
name='test',
version='0.1',
packages=['bin']
)
然后您 运行 在项目的根目录下执行以下 shell 命令:
python setup.py develop
通过这些步骤,您应该能够按需要导入文件。
请注意,test.eff-info 文件夹是自动创建的。
希望对你有帮助
在test_file.py
的开头添加下面的代码,它将获取当前文件的当前目录,然后找到子目录unittests
,最后到达父目录bin
.
另外,最好把file => file.py
的名字改成别的名字,避免冲突。
试试下面的代码并告诉我。
import os,sys,inspect
current_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
unittests_dir = os.path.dirname(current_dir)
bin_dir = os.path.dirname(unittests_dir)
sys.path.insert(0, bin_dir)
import file
我不确定我哪里出错了,我已经尝试了其他问题中列出的一堆方法,所以我会重新询问以防我遗漏了什么。
我有以下结构:
|-bin/
-file.py
|-unittests/
-__init__.py
|-test_bin/
-__init__.py
-test_file.py
我在 test_file.py
中尝试了以下方法但无济于事:
1) Import Error: No module named bin.file
from bin.file import *
2) Import Error: No module named bin.file
import sys
from os import path
sys.path.append(path.dirname(path.dirname(path.abspath(__file__))))
from bin.file import *
3) ValueError: Attempted relative import in non-package
from ...bin.file import *
我使用的命令是python test_file.py
Python 导入有点奇怪。首先,要解决您的问题 - 添加一个名为 __init__.py
的空文件到您的 bin 目录。现在来解释为什么-
Python 构建搜索路径。它使用环境变量 PYTHONPATH 中的所有目录,加上 site-packages
用于您的 virtualenv 或您的基本解释器。一般运行ning python
也会把当前工作目录添加到PYTHONPATH中。
因此可以导入其中一个目录中的任何 .py
文件。但是对于模块,它不会查看每个目录。相反,它只计算包含那个魔法 __init__.py
文件的目录。所以你会在那里看到 bin.py
.. 但不是 bin/bin.py
,直到你添加 __init__.py
文件。
(这适用于一直向下的嵌套目录)。
看看你的问题,这可能仍然是个问题 - 如果你从 test_file 所在的底部目录 运行ning 你的命令,你的根目录不在搜索中无论如何都要看到 bin
的路径。所以你必须从根 python unittests/test_bin/test_file.py
PYTHONPATH=../..:$PYTHONPATH python test_file.py
或 运行 命令
要使导入工作,您需要位于项目的根目录下。
但是,您可以在包的根目录添加一个 setup.py 文件,这样您就可以从任何地方导入您的函数(见下文):
Setup.py :
from setuptools import setup
setup(
name='test',
version='0.1',
packages=['bin']
)
然后您 运行 在项目的根目录下执行以下 shell 命令:
python setup.py develop
通过这些步骤,您应该能够按需要导入文件。
请注意,test.eff-info 文件夹是自动创建的。
希望对你有帮助
在test_file.py
的开头添加下面的代码,它将获取当前文件的当前目录,然后找到子目录unittests
,最后到达父目录bin
.
另外,最好把file => file.py
的名字改成别的名字,避免冲突。
试试下面的代码并告诉我。
import os,sys,inspect
current_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
unittests_dir = os.path.dirname(current_dir)
bin_dir = os.path.dirname(unittests_dir)
sys.path.insert(0, bin_dir)
import file