[英]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 导入有点奇怪。 首先,要解决您的问题 - 在您的 bin 目录中添加一个名为__init__.py
的空文件。 现在解释为什么——
Python 建立了一个搜索路径。 它使用环境变量 PYTHONPATH 中的所有目录,以及用于 virtualenv 或基本解释器的site-packages
。 一般运行python
也会把当前工作目录添加到PYTHONPATH中。
因此,可以导入这些目录之一中的任何.py
文件。 但是对于模块,它不会查看每个目录。 相反,它只计算包含那个神奇的__init__.py
文件的目录。 所以你会在那里看到bin.py
.. 但不是bin/bin.py
,直到你添加__init__.py
文件。
(这适用于一直向下的嵌套目录)。
看看你的问题,这可能仍然是一个问题——如果你从 test_file 所在的底部目录运行你的命令,你的根目录不在搜索路径上,无论如何都可以看到bin
。 所以你必须做PYTHONPATH=../..:$PYTHONPATH python test_file.py
或者从根python unittests/test_bin/test_file.py
运行命令
在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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.