我具有以下目录结构:
py_test
├── __init__.py
├── dir1
│ ├── __init__.py
│ └── script1.py
└── dir2
├── __init__.py
└── script2.py
在script2
中,我要“ import ..\script1
”。
我在script2
中尝试过的事情:
不起作用
from ..dir1 import script1
ImportError: attempted relative import with no known parent package`
作品
import sys, os
path2add = os.path.normpath(os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir, 'dir1')))
if (not (path2add in sys.path)) :
sys.path.append(path2add)
如果我想使用选项1,最简单的文件/目录结构(即文件最少)是什么?
我知道this workaround,但是我想知道是否可以避免创建该目录结构,而仍然使用type-1 import
。
我当前使用的是How to import a Python class that is in a directory above?,它使用的是类型2 import
。
相关:
Import a module from a directory (package) one level up
Using importlib to dynamically import module(s) containing relative imports
答案 0 :(得分:2)
如评论中所述, 如果 script2.py
是您的入口点,则尝试将模块导入目录将不起作用。
如果模块的
__name__
不包含任何程序包信息(例如,将其设置为__main__
),则相对导入的解析就好像该模块是顶级模块一样,无论在哪里该模块实际上位于文件系统上。
如果模块的__name__
设置为__main__
,或者它是您通过诸如python script2.py
之类传递给解释器的入口,则设置为sys.path.append
。
任何这样运行的python模块不再具有从更高目录导入文件所需的信息。
因此,您有两个选择:
script1
使用解决方法这可以按您希望的方式工作,但是相当麻烦。
假设您的程序包中有多个脚本需要运行,则可以创建一个新文件,该文件同时导入script2
和sys.path
,然后根据命令行参数调用所需的功能。这样一来,您就可以保持当前目录结构,并使相对导入工作正常,而不必担心const numbersToMessage = ["+15558675310", "+14158141829", "+15017122661"]
numbersToMessage.forEach(async number => {
const message = await client.messages.create({
body: 'message body',
from: '+16468635472',
to: number
});
console.log(message.status)
});
。