在终端窗口python文件的直接运行和模块运行的区别
下图是项目的结构
直接运行(命令行:python aaa/bbb/1.py)
代码如下:
import sys
import os
print(sys.path)
print (os.path.abspath('.'))#获得当前工作目录
print (os.path.abspath('..'))#获得当前工作目录的父目录
print (os.path.abspath('../..'))#获得当前工作目录的父目录的父目录
终端窗口命令行命令和结果如下:
PS E:\project\SSAGCN> python aaa/bbb/1.py
['E:\\project\\SSAGCN\\aaa\\bbb', 'D:\\software\\anaconda\\install\\envs\\condaenv\\python39.zip', 'D:\\software\\anaconda\\install\\envs\\condaenv\\DLLs', '
D:\\software\\anaconda\\install\\envs\\condaenv\\lib', 'D:\\software\\anaconda\\install\\envs\\condaenv', 'D:\\software\\anaconda\\install\\envs\\condaenv\\l
ib\\site-packages']
E:\project\SSAGCN
E:\project
E:\
结论如下:
直接运行path变量里面第一个路径是python文件1.py所在的目录,’.‘是终端窗口的当前目录,’. .'是终端窗口的上一级目录,以此类推
举例:
PS E:\project\SSAGCN\aaa> python bbb/1.py
['E:\\project\\SSAGCN\\aaa\\bbb', 'D:\\software\\anaconda\\install\\envs\\condaenv\\python39.zip', 'D:\\software\\anaconda\\install\\envs\\condaenv\\DLLs', '
D:\\software\\anaconda\\install\\envs\\condaenv\\lib', 'D:\\software\\anaconda\\install\\envs\\condaenv', 'D:\\software\\anaconda\\install\\envs\\condaenv\\l
ib\\site-packages']
E:\project\SSAGCN\aaa
E:\project\SSAGCN
E:\project
模块运行(python -m aaa.bbb.1)
代码如下(没变):
import sys
import os
print(sys.path)
print (os.path.abspath('.'))#获得当前工作目录
print (os.path.abspath('..'))#获得当前工作目录
print (os.path.abspath('../..'))#获得当前工作目录
终端窗口命令行命令和结果如下:
PS E:\project\SSAGCN> python -m aaa.bbb.1
['E:\\project\\SSAGCN', 'D:\\software\\anaconda\\install\\envs\\condaenv\\python39.zip', 'D:\\software\\anaconda\\install\\envs\\condaenv\\DLLs', 'D:\\softwa
re\\anaconda\\install\\envs\\condaenv\\lib', 'D:\\software\\anaconda\\install\\envs\\condaenv', 'D:\\software\\anaconda\\install\\envs\\condaenv\\lib\\site-p
ackages']
E:\project\SSAGCN
E:\project
E:\
结论如下:
模块运行path变量里面第一个路径是终端窗口的当前目录,’.’ 、’. .‘和’. ./. .'和直接运行含义一样。
举例:
PS E:\project\SSAGCN\aaa> python -m bbb.1
['E:\\project\\SSAGCN\\aaa', 'D:\\software\\anaconda\\install\\envs\\condaenv\\python39.zip', 'D:\\software\\anaconda\\install\\envs\\condaenv\\DLLs', 'D:\\s
oftware\\anaconda\\install\\envs\\condaenv\\lib', 'D:\\software\\anaconda\\install\\envs\\condaenv', 'D:\\software\\anaconda\\install\\envs\\condaenv\\lib\\s
ite-packages']
E:\project\SSAGCN\aaa
E:\project\SSAGCN
E:\project
sys.path.extend()的本质
之前提到过,不论直接运行还是模块运行,’.’、’. .‘还是’. ./. .'所表达的目录是一致的。
代码如下:
import sys
from code1 import data
终端窗口命令行和结果如下:
PS E:\project\SSAGCN> python aaa/bbb/1.py
Traceback (most recent call last):
File "E:\project\SSAGCN\aaa\bbb\1.py", line 8, in <module>
from code1 import data
ModuleNotFoundError: No module named 'code1'
原因:
因为当前path变量里面的目录没有 E:\project\SSAGCN,所以模块调用错误。
修改代码如下:
import sys
sys.path.extend(['./'])
from code1 import data
终端窗口命令行和结果如下(没有报错):
PS E:\project\SSAGCN> python aaa/bbb/1.py
PS E:\project\SSAGCN>
举例1:
代码如下:
import sys
from code1 import data
终端窗口命令行和结果如下(报错):
PS E:\project\SSAGCN\aaa> python -m bbb.1
Traceback (most recent call last):
File "D:\software\anaconda\install\envs\condaenv\lib\runpy.py", line 197, in _run_module_as_main
return _run_code(code, main_globals, None,
File "D:\software\anaconda\install\envs\condaenv\lib\runpy.py", line 87, in _run_code
exec(code, run_globals)
File "E:\project\SSAGCN\aaa\bbb\1.py", line 9, in <module>
from code1 import data
ModuleNotFoundError: No module named 'code1'
举例2:
代码如下:
import sys
sys.path.extend(['../'])
from code1 import data
终端窗口命令行和结果如下(没有报错):
PS E:\project\SSAGCN\aaa> python -m bbb.1
PS E:\project\SSAGCN\aaa>