subprocess运行python文件无法获取环境变量

本文介绍了如何在没有GitLab和Jenkins自动化部署的情况下,通过FastAPI定义webhook接口,接收GitLab推送并处理环境变量,以解决子进程无法获取父进程环境变量的问题。作者提供了在子进程中显式传递环境变量的示例代码,确保进程间的隔离和安全。
摘要由CSDN通过智能技术生成

背景:

在没有使用 GitLab 和 Jenkins 进行自动化部署的情况下,采用 webhook 自动触发 Git 拉取并重新启动项目。

  • 实现方式:
    • 使用 FastAPI 定义 webhook 接口,接收来自 GitLab 的推送
    • 当 webhook 接收到通知时,使用 subprocess 模块执行命令,拉取代码并结束原有进程,重新启动新的进程
    • 在使用 subprocess.run 运行命令启动项目时,由于是在子进程中运行,导致项目无法获取服务器环境变量。然而在服务器使用 Python3 终端获取时却能够正常访问。
  • 原因
    • 在运行项目时,使用subprocess.run方法运行,会有新建一个子进程,然而进程之间有隔离机制所以导致子进程运行的项目无法获取到环境变量,需要在运行项目时传递环境变量
    • 进程隔离是操作系统为了保障安全性和稳定性而采取的一种机制。即使在同一台 Linux 服务器上运行,不同的进程之间仍然会受到操作系统的进程隔离。这种隔离确保了各个进程在运行时相互独立、互不干扰,并且提高了系统的安全性和可靠性。

由于每个进程都有自己独立的内存空间和环境变量,因此当使用 subprocess.run 启动一个新的子进程时,该子进程将无法直接访问父进程(即主进程)中设置的环境变量。这是出于安全和隔离的考虑,以防止不同进程之间对环境变量的意外修改及信息泄漏。

为了在子进程中获取父进程的环境变量,需要显式地将环境变量传递给子进程。这样可以保持进程隔离的安全特性,同时允许父子进程之间共享必要的环境信息。

  • 解决办法:

    为了在子进程中获取父进程的环境变量,需要显式地将环境变量传递给子进程。以下是一个示例代码:

import os
import subprocess
# 在父进程中获取环境变量
env = {'private_path': os.environ.get('private_path'),
       'public_path': os.environ.get('public_path')}

# 将父进程中的环境变量的值传递给子进程
subprocess.run("nohup python3 run.py > /usr/local/output.log 2>&1 &", shell=True,
                                cwd="/usr/local/aggregationservices/interfaceServices", capture_output=True,
                                text=True, env=env)

# 在Linux终端中设置环境变量
export KEY_PATH=/path/to/your/key

# 使用Python读取环境变量
import os

key_path = os.environ.get('KEY_PATH')
print(key_path)

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用 Python 的 `subprocess` 模块来运行 vbs 文件。 示例代码如下: ``` import subprocess # Windows subprocess.run(['cscript', '/nologo', 'script.vbs'], shell=True) # Linux or macOS subprocess.run(['wscript', 'script.vbs'], shell=True) ``` 注意:需要确保系统中已安装 vbs 解释器,并且已将 vbs 解释器的路径添加到系统的 PATH 环境变量中。 ### 回答2: 要使用Python运行VBScript文件,可以使用`subprocess`模块。 首先,需要导入`subprocess`模块: ```python import subprocess ``` 然后,使用`subprocess`模块的`run`函数来运行VBScript文件: ```python subprocess.run(["cscript", "path/to/your/vbs/file.vbs"]) ``` 上述代码的`path/to/your/vbs/file.vbs`表示VBScript文件的路径。如果VBScript文件Python脚本在同一目录下,可以直接使用文件名。 可以使用`subprocess`模块的其他函数来实现更多复杂的操作。例如,如果希望获得VBScript文件的输出结果,可以使用`subprocess.run`的`capture_output`参数: ```python result = subprocess.run(["cscript", "path/to/your/vbs/file.vbs"], capture_output=True, text=True) print(result.stdout) ``` 上述代码中,`capture_output=True`表示捕获输出结果,`text=True`表示以文本形式返回输出结果(Python 3.7及更高版本可用)。 总结起来,要使用Python运行VBScript文件,需要导入`subprocess`模块,然后使用`subprocess.run`函数,并指定VBScript文件的路径。如有需要,还可使用其他参数来获取输出结果等。 ### 回答3: Python可以用subprocess模块来运行VBS文件subprocess模块是Python的内置模块,专门用于创建和管理子进程。下面是一个简单的示例: ```python import subprocess # 定义要执行的VBS文件路径 vbs_file = r'C:\path\to\your\VBS\file.vbs' # 使用subprocess模块运行VBS文件 try: subprocess.run(['cscript', vbs_file], check=True) print('VBS文件成功运行!') except subprocess.CalledProcessError as e: print('VBS文件运行出错:', e) ``` 在代码中,我们首先通过定义vbs_file变量来指定要运行的VBS文件的路径。然后使用subprocess.run()函数来运行该VBS文件,函数的第一个参数是一个由命令和参数组成的列表,我们这里使用['cscript', vbs_file']来执行VBScript脚本。我们还传递了check=True参数,这将会检查子进程的返回码,如果返回码不为0,将会抛出CalledProcessError异常。最后,我们通过try-except块来捕获异常,并打印出相应的提示信息。 需要注意的是,在运行VBS文件之前,确保已经安装了VBScript解释器,一般来说Windows上默认是已经安装的,可以通过在命令提示符窗口中输入"cscript"命令来验证。如果未安装,可以前往Microsoft官方网站下载并安装。 希望这个回答对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值