自定义Python命令执行脚本

271 阅读1分钟

当执行Python脚本时,自动添加查找模块的路径,将项目目录下python_modules目录添加到PYTHONPATH环境变量的第二个位置。

方案1:

用法说明:

1、将下面的脚本内容复制到/usr/bin/my-python文件中(需要创建这个文件)

2、赋予执行权限chmod +x /usr/bin/my-python

3、使用my-python执行Python脚本:my-python test.py

#!/usr/bin/env python3
import os
import sys

# 获取要执行的脚本文件所在目录的绝对路径
script_dir = os.path.dirname(os.path.abspath(sys.argv[1]))

def load_env(dir_path):
    dependency_path = os.path.join(dir_path, 'python_modules')
    if os.path.exists(dependency_path):
        sys.path.insert(1,dependency_path)
        return True
    else:
        return False  

# 逐级向上查找python_modules目录并添加到PYTHONPATH环境变量
while script_dir != os.path.abspath(os.sep):
    if load_env(script_dir):
        break
    script_dir = os.path.dirname(script_dir)

# 拷贝环境变量
os.environ["PYTHONPATH"]=":".join(sys.path[1:])
env = os.environ.copy()

# 将环境变量传递到新程序中,并执行 Python 脚本
os.execve(sys.executable, sys.argv, env)

用法演示:

macdeMacBook-Air:t1 mac$ ll /usr/bin/my-python 
-rwxr-xr-x  1 mac  staff  778  2 24 22:08 /usr/bin/my-python
macdeMacBook-Air:test mac$ ll
total 0
drwxr-xr-x  4 mac  staff  128  2 24 22:03 t1
macdeMacBook-Air:test mac$ ll t1/
total 8
drwxr-xr-x  2 mac  staff  64  2 24 21:41 python_modules
-rw-r--r--  1 mac  staff  27  2 24 21:27 test.py
macdeMacBook-Air:test mac$ my-python t1/test.py 
['/Users/mac/pytools/test/t1', '/Users/mac/pytools/test/t1/python_modules', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python38.zip', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/lib-dynload', '/Users/mac/Library/Python/3.8/lib/python/site-packages', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages']
macdeMacBook-Air:test mac$ cd t1/
macdeMacBook-Air:t1 mac$ my-python test.py 
['/Users/mac/pytools/test/t1', '/Users/mac/pytools/test/t1/python_modules', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python38.zip', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/lib-dynload', '/Users/mac/Library/Python/3.8/lib/python/site-packages', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages']
macdeMacBook-Air:t1 mac$ 

方案2:

在python的lib库中,创建pth文件,添加自定义存放模块的目录路径。

用法说明:

1、进入到/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages目录下

备注:查找python的lib库的方法

macdeMacBook-Air:site-packages mac$ which python3
/Library/Frameworks/Python.framework/Versions/3.8/bin/python3
macdeMacBook-Air:site-packages mac$ 
macdeMacBook-Air:site-packages mac$ cd /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/
macdeMacBook-Air:site-packages mac$

2、创建foo.pth文件,将下面的内容拷贝到文件内

import sys,os;list(map(lambda index: sys.path.insert(0,os.path.join(os.sep,os.sep.join((os.path.abspath(sys.argv[0]) if os.path.isdir(os.path.abspath(sys.argv[0])) else os.path.dirname( os.path.abspath(sys.argv[0]))).split(os.sep)[0:index+1])+os.sep+"python_modules")), list(range(len((os.path.abspath(sys.argv[0]) if os.path.isdir(os.path.abspath(sys.argv[0])) else os.path.dirname( os.path.abspath(sys.argv[0]))).split(os.sep))))))

备注:在pth文件内,一行放入一个目录,这个目录会被自动添加到sys.path环境变量中。如果要动态添加目录,要将代码都写到同一行中才有效。

用法演示:

macdeMacBook-Air:demo mac$ ll
total 16
-rw-r--r--   1 mac  staff  634  2 25 09:09 main.py
drwxr-xr-x  30 mac  staff  960  2 24 22:30 python_modules
-rw-r--r--   1 mac  staff   28  2 25 10:37 test.py
macdeMacBook-Air:demo mac$ cat test.py 
import sys;
print(sys.path)
macdeMacBook-Air:demo mac$ python3 test.py 
['/Users/mac/Documents/CodeProjects/demo', '/Users/mac/Documents/CodeProjects/demo/python_modules', '/Users/mac/Documents/CodeProjects/python_modules', '/Users/mac/Documents/python_modules', '/Users/mac/python_modules', '/Users/python_modules', '/python_modules', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python38.zip', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/lib-dynload', '/Users/mac/Library/Python/3.8/lib/python/site-packages', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages']
macdeMacBook-Air:demo mac$ 

方案3:

对方案2进行优化,只将python_modules目录是已存在的路径添加到环境变量中

在foo.pth文件中,将下面的内容拷贝到文件内:

import sys,os;[sys.path.insert(0,os.path.join(os.sep,os.sep.join((os.path.abspath(sys.argv[0]) if os.path.isdir(os.path.abspath(sys.argv[0])) else os.path.dirname( os.path.abspath(sys.argv[0]))).split(os.sep)[0:index+1])+os.sep+"python_modules")) for index in range(len((os.path.abspath(sys.argv[0]) if os.path.isdir(os.path.abspath(sys.argv[0])) else os.path.dirname( os.path.abspath(sys.argv[0]))).split(os.sep))) if os.path.exists(os.path.join(os.sep,os.sep.join((os.path.abspath(sys.argv[0]) if os.path.isdir(os.path.abspath(sys.argv[0])) else os.path.dirname( os.path.abspath(sys.argv[0]))).split(os.sep)[0:index+1])+os.sep+"python_modules"))]

用法演示:

macdeMacBook-Air:demo mac$ ll
total 16
-rw-r--r--   1 mac  staff  634  2 25 09:09 main.py
drwxr-xr-x  30 mac  staff  960  2 24 22:30 python_modules
-rw-r--r--   1 mac  staff   27  2 25 11:22 test.py
macdeMacBook-Air:demo mac$ cat test.py 
import sys
print(sys.path)
macdeMacBook-Air:demo mac$ python3 test.py 
['/Users/mac/Documents/CodeProjects/demo', '/Users/mac/Documents/CodeProjects/demo/python_modules', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python38.zip', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/lib-dynload', '/Users/mac/Library/Python/3.8/lib/python/site-packages', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages']
macdeMacBook-Air:demo mac$ 

补充:

将模块安装到项目目录下的python_modules目录下

pip3 install flask -t ./python_modules

vscode修改配置文件settings.json,将项目目录下python_modules添加到代码提示的查找路径中

    "terminal.integrated.env.osx": {
        "PYTHONPATH": "${workspaceFolder}/python_modules"
    },
    "python.autoComplete.extraPaths": [
        "${workspaceFolder}/python_modules"
    ],
    "python.analysis.extraPaths": [
        "${workspaceFolder}/python_modules"
    ]