我有以下目录结构:
application
    tests
        main.py
    main.py
Run Code Online (Sandbox Code Playgroud)
application/main.py包含一些函数.
tests/main.py将包含我对这些函数的测试,但我无法导入顶级main.py. 我收到以下错误:
ImportError: Import by filename is not supported.
Run Code Online (Sandbox Code Playgroud)
我试图使用以下语法导入:
import main
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
小智 51
如果您希望脚本更具可移植性,请考虑自动查找父目录:
import os, sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# import ../db.py
import db
Run Code Online (Sandbox Code Playgroud)
        Mr_*_*s_D 47
8 年后 - 不幸的是,这里的大多数其他答案仍然不正确 - 除了LennartRegebro 的(和 BrenBarn 的)是不完整的。为了未来读者的利益 - OP 首先应该添加文件,__init__.py如下所示
root
    application
        __init__.py
        main.py
        tests
            __init__.py
            main.py
Run Code Online (Sandbox Code Playgroud)
然后:
$ cd root
$ python -m application.tests.main # note no .py
Run Code Online (Sandbox Code Playgroud)
或者
$ cd application
$ python -m tests.main
Run Code Online (Sandbox Code Playgroud)
直接从其包内部运行脚本是一种反模式 - 正确的方法是从根包的父目录-m切换运行 - 这样所有包都会被检测到,并且相对/绝对导入按预期工作。
Len*_*bro 16
首先,您需要通过添加__init__.py文件将目录设置为包:
application
    tests
        __init__.py
        main.py
    __init__.py
    main.py
Run Code Online (Sandbox Code Playgroud)
然后,您应确保上面的应用程序目录已打开sys.path.有很多方法可以做到这一点,比如将应用程序放入包中并进行安装,或只是在正确的文件夹中执行等等.
0x9*_*x90 15
您必须将应用程序目录添加到您的路径:
import sys
sys.path.append("/path/to/dir")
from app import object
Run Code Online (Sandbox Code Playgroud)
或者来自shell:
setenv PATH $PATH:"path/to/dir"
Run Code Online (Sandbox Code Playgroud)
如果你使用windows:在Windows中添加变量到路径.
或者从命令行:
set PATH=%PATH%;C:\path\to\dir
Run Code Online (Sandbox Code Playgroud)
        要导入父目录的不同子目录中的文件,请尝试如下操作:
sys.path.append(os.path.abspath('../other_sub_dir'))
import filename_without_py_extension
Run Code Online (Sandbox Code Playgroud)
编辑:缺少右括号。
您无法从父/兄弟目录中导入内容.您只能从系统路径上的目录或当前目录或程序包中的子目录中导入内容.由于您没有__init__.py文件,因此您的文件不会形成包,只能通过将它们放在系统路径上来导入它们.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           63375 次  |  
        
|   最近记录:  |