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