import subprocess import signal import os script_path = "/home/sqa/PycharmProjects/PythonProject2/scripts/add_robot.sh" # 第一步:执行source并获取环境变量 env = {} source_cmd = f"source {script_path}" result = subprocess.run( ["bash", "-c", source_cmd], stdout=subprocess.PIPE, text=True ) if result.returncode == 0: # 解析环境变量 for line in result.stdout.splitlines(): if '=' in line: key, value = line.split('=', 1) env[key] = value # 第二步:使用捕获的环境执行fs_add_robot subprocess.run( ["fs_add_robot", "192.168.100.45"], stdout=subprocess.PIPE, text=True ) else: print("source命令执行失败") Traceback (most recent call last): File "/home/sqa/PycharmProjects/PythonProject2/test2.py", line 22, in <module> subprocess.run( File "/usr/lib/python3.10/subprocess.py", line 503, in run with Popen(*popenargs, **kwargs) as process: File "/usr/lib/python3.10/subprocess.py", line 971, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "/usr/lib/python3.10/subprocess.py", line 1863, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'fs_add_robot'
fs_add_robot
命令时,系统提示“No such file or directory: 'fs_add_robot'”。用户之前尝试将source
命令和fs_add_robot
分开执行,但环境变量未正确传递,导致后续命令找不到。
首先,我需要理解用户代码的结构。用户使用subprocess.run
执行source
命令,试图获取环境变量,然后在成功时执行fs_add_robot
。但问题在于,source
命令在子shell中执行,其设置的环境变量不会自动传递到父进程(即Python脚本)。因此,当用户直接运行fs_add_robot
时,该命令不在PATH中,导致找不到。
接下来,用户可能在尝试拆分命令,但未正确传递环境变量。在之前的对话中,我建议过两种方案:保持命令合并或手动捕获环境变量。用户可能尝试了第二种方案,但仍有问题。需要检查用户代码中的env
变量是否正确捕获了环境变量,并在执行fs_add_robot
时传递了这些变量。
查看用户提供的代码,发现第二步的subprocess.run
调用中没有传递env=env
参数,导致子进程未继承捕获的环境变量。这可能是导致错误的主要原因。此外,fs_add_robot
可能是一个shell函数或脚本中的命令,而不仅仅是一个可执行文件,因此直接调用可能会失败。
还需要确认add_robot.sh
脚本是否确实设置了fs_add_robot
函数或导出了必要的环境变量。如果fs_add_robot
是在脚本中定义的函数,那么在子shell中执行source
后,该函数仅在那个子shell中有效,无法通过环境变量传递到另一个子进程中。此时,用户可能需要通过shell脚本来调用该函数,而不是直接执行。
可能的解决方案包括:保持命令合并,使用同一个shell进程执行两个命令;或者确保fs_add_robot
是一个独立可执行文件,并正确设置PATH环境变量。此外,检查用户代码中是否遗漏了env=env
参数,导致环境变量未传递。
总结问题根源:环境变量未正确传递,且fs_add_robot
可能不是全局可执行文件,需要依赖脚本中的环境设置。需要指导用户修正代码,传递环境变量,并确认fs_add_robot
的可用性。以下是针对你的代码问题的详细分析和解决方案:
错误原因分析
fs_add_robot
命令未找到
错误FileNotFoundError: [Errno 2] No such file or directory: 'fs_add_robot'
表明:fs_add_robot
不是一个系统全局可执行命令。- 它实际上是
add_robot.sh
脚本中定义的 Shell函数 或依赖脚本设置的 环境变量。
环境变量传递失败
你通过source {script_path}
捕获环境变量的方式存在以下问题:source
命令在子Shell中执行,修改的环境变量不会自动传递到父进程(Python脚本)。fs_add_robot
可能是一个Shell函数(而非独立可执行文件),无法通过subprocess.run(["fs_add_robot", ...])
直接调用。
解决方案
方案1:保持命令合并执行
直接通过Shell执行完整命令链,确保 fs_add_robot
在脚本环境中生效:
import subprocess
script_path = "/home/sqa/PycharmProjects/PythonProject2/scripts/add_robot.sh"
# 合并命令,通过 && 保证顺序执行
command = f"source {script_path} && fs_add_robot 192.168.100.45"
result = subprocess.run(
["bash", "-c", command], # 通过bash解释器执行完整命令
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
if result.returncode == 0:
print("执行成功!")
else:
print(f"执行失败,错误信息:\n{result.stderr}")
关键点:
- 通过
&&
连接命令,确保fs_add_robot
在source
成功后执行。 - 使用
bash -c
执行整个命令链,确保fs_add_robot
在同一个Shell会话中生效。
方案2:验证 fs_add_robot
的实际类型
如果 fs_add_robot
是脚本中定义的 函数,需通过Shell直接调用它:
import subprocess
script_path = "/home/sqa/PycharmProjects/PythonProject2/scripts/add_robot.sh"
# 显式调用函数
command = f"source {script_path} && fs_add_robot 192.168.100.45"
result = subprocess.run(
["bash", "-c", command],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
方案3:调试环境变量传递(仅当 fs_add_robot
是独立程序时有效)
若 fs_add_robot
是依赖环境变量的可执行文件,需修复环境变量传递逻辑:
import subprocess
script_path = "/home/sqa/PycharmProjects/PythonProject2/scripts/add_robot.sh"
# 捕获环境变量(需脚本通过 `export` 导出变量)
source_cmd = f"source {script_path} && env" # 使用 `env` 输出所有环境变量
result = subprocess.run(
["bash", "-c", source_cmd],
stdout=subprocess.PIPE,
text=True
)
if result.returncode == 0:
env = {}
for line in result.stdout.splitlines():
if '=' in line:
key, value = line.split('=', 1)
env[key] = value
# 显式传递环境变量
subprocess.run(
["fs_add_robot", "192.168.100.45"],
env=env, # 关键!传递捕获的环境变量
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
注意事项:
- 确保
add_robot.sh
脚本通过export
导出变量(例如export PATH=/new/path:$PATH
)。 - 若
fs_add_robot
是脚本中定义的函数,此方法仍然无效。
关键验证步骤
检查
fs_add_robot
的类型
在终端中手动执行以下命令:source /home/sqa/PycharmProjects/PythonProject2/scripts/add_robot.sh type fs_add_robot
- 若输出显示
fs_add_robot is a function
,则必须通过Shell调用。 - 若输出显示路径(如
/usr/bin/fs_add_robot
),则它是一个可执行文件。
- 若输出显示
验证脚本是否导出必要变量
检查add_robot.sh
是否包含export
语句,例如:export PATH="/custom/path:$PATH"
总结
情况 | 解决方案 |
---|---|
fs_add_robot 是函数 |
必须通过Shell合并执行命令 |
fs_add_robot 是依赖环境变量的程序 |
捕获并传递环境变量 |
脚本未正确导出变量 | 修改脚本添加 export |
建议优先使用 方案1,确保命令在同一个Shell会话中执行。若问题仍存在,请提供 add_robot.sh
的部分内容以进一步分析。
相关推荐


















