运行下面代码是出现问题,代码如下:import subprocess import os import time import sys import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') # 核心配置参数 LD_PATH = r"E:\LenovoSoftstore\Install\LD\leidian\LDPlayer9\dnplayer.exe" # 您的自定义路径 ADB_PORT = "emulator-5554" # 默认第一个实例端口 adb_path = r'E:\LenovoSoftstore\Install\LD\leidian\LDPlayer9\adb.exe' # 步骤1:启动雷电模拟器 def launch_emulator(): try: # 注意:不要添加引号,subprocess会处理路径空格 subprocess.Popen([LD_PATH, "--start"]) print("⚡ 模拟器启动命令已发送") except FileNotFoundError: print(f"❌ 路径错误:{LD_PATH}\n请检查:\n1. 路径是否存在\n2. 是否安装了雷电9") def get_installed_apps(): # 使用pm list packages命令获取所有包名 cmd = [adb_path, 'shell', 'pm', 'list', 'packages'] result = subprocess.run(cmd, capture_output=True, text=True) return result.stdout def get_third_party_apps(): cmd = [adb_path, 'shell', 'pm', 'list', 'packages', '-3'] result = subprocess.run(cmd, capture_output=True, text=True) return result.stdout # 执行并打印结果 print("已安装应用包名列表:") print(get_third_party_apps()) subprocess.run(["adb", "shell", "am", "start", "-n", "com.mojian.fmz.UnityPlayerActivity"]) # 执行主流程 if __name__ == "__main__": launch_emulator() 错误如下:已安装应用包名列表: package:com.mojian.fmz.neice package:com.mojian.fmz Traceback (most recent call last): File "E:\PYthonterm\C!.py", line 35, in <module> subprocess.run(["adb", "shell", "am", "start", "-n", "com.mojian.fmz.UnityPlayerActivity"]) ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Software\python\Lib\subprocess.py", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File "D:\Software\python\Lib\subprocess.py", line 1036, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Software\python\Lib\subprocess.py", line 1548, in _execute_child hp, ht, pid, tid = _winapi.CreateProcess(executable, args, ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^ # no special security ^^^^^^^^^^^^^^^^^^^^^ ...<4 lines>... cwd, ^^^^ startupinfo) ^^^^^^^^^^^^ FileNotFoundError: [WinError 2] 系统找不到指定的文件。
时间: 2025-04-10 08:50:22 浏览: 54
<think>好的,用户遇到了运行Python脚本时的FileNotFoundError错误,具体是在执行adb命令的时候。我需要仔细分析错误信息和代码,找出问题所在。
首先看错误信息,错误发生在调用subprocess.run(["adb", ...])时,系统找不到指定的文件。这说明Python在尝试运行adb命令时,无法找到adb.exe的位置。可能的原因有几个:
1. adb不在系统的环境变量PATH中,导致直接使用"adb"命令无法识别。
2. 代码中虽然定义了adb_path变量,但在调用subprocess时没有使用这个变量,而是直接用了"adb",导致路径错误。
3. 雷电模拟器的adb.exe可能没有被正确配置,或者路径中存在空格或特殊字符,导致subprocess无法正确解析。
查看用户的代码,发现用户确实定义了adb_path变量,指向了E盘下的adb.exe。但是在执行subprocess.run时,用的是["adb", ...],而没有使用adb_path。这应该是问题的关键所在。用户可能在之前的函数如get_installed_apps中正确使用了adb_path,但在最后的subprocess.run调用中遗漏了,直接用了"adb",导致系统找不到这个命令。
另外,用户可能没有正确连接模拟器,或者adb服务没有启动,但根据错误信息是文件未找到,应该更倾向于路径问题。此外,检查雷电模拟器的adb端口是否正确,是否有多个实例导致端口冲突,但错误信息是文件找不到,所以暂时先不考虑端口问题。
解决方案应该是将最后一行subprocess.run中的"adb"替换为adb_path变量,即使用绝对路径来调用adb.exe。这样Python就能正确找到可执行文件的位置,避免依赖系统环境变量。
另外,用户可能需要确保雷电模拟器的ADB端口正确,并且模拟器已经启动完成后再执行adb命令,可能需要添加等待时间。但当前错误是文件找不到,所以优先解决路径问题,之后如果还有连接问题,再处理端口和连接部分。
总结,主要问题在于subprocess调用adb时未使用绝对路径,导致系统找不到文件。修改代码中的adb命令,使用定义的adb_path即可解决。</think>让我们逐步分析并解决代码中的问题:
问题定位:`FileNotFoundError`出现在`subprocess.run(["adb", "shell"...])`这一行,说明系统找不到`adb`命令。
原因分析:
1. 在之前的代码中你正确使用了自定义`adb_path`,但最后的`adb`命令没有使用该路径
2. 系统环境变量中没有配置ADB路径,导致直接使用`adb`命令失效
解决方案:
```python
# 修改最后一行代码(原错误行)
# 原错误代码:
# subprocess.run(["adb", "shell", "am", "start", "-n", "com.mojian.fmz.UnityPlayerActivity"])
# 修正后的代码:
subprocess.run([adb_path, "shell", "am", "start", "-n", "com.mojian.fmz.UnityPlayerActivity"])
```
改进建议(增强代码健壮性):
```python
# 建议在启动模拟器后增加等待时间
import time
if __name__ == "__main__":
launch_emulator()
time.sleep(15) # 等待模拟器完全启动
# 添加adb连接确认
connect_cmd = [adb_path, "connect", ADB_PORT]
subprocess.run(connect_cmd, timeout=10)
# 再执行后续操作
```
常见问题排查清单:
1. ✅ 已解决路径问题:确保所有`adb`调用都使用绝对路径
2. 🔍 检查雷电多开:如果使用多开模拟器,确认`ADB_PORT`对应正确的实例端口
3. 🔌 ADB连接验证:在CMD中手动执行:
```bash
E:\LenovoSoftstore\Install\LD\leidian\LDPlayer9\adb.exe connect emulator-5554
```
4. ⏱️ 时序问题:模拟器启动需要时间,建议添加`time.sleep()`
5. 🔄 端口冲突:如果同时运行多个模拟器,尝试重启adb服务:
```python
subprocess.run([adb_path, "kill-server"])
subprocess.run([adb_path, "start-server"])
```
补充说明:
当使用雷电模拟器时,建议使用其自带的adb版本(如你代码中配置的路径),避免与Android SDK中的adb产生版本冲突。如果需要批量操作多个模拟器实例,可以通过修改端口号实现:
```python
# 多开实例示例
INSTANCE_PORTS = ["emulator-5554", "emulator-5556", "emulator-5558"]
```
阅读全文
相关推荐



















