Python脚本切换目录后执行p4 sync失败,p4 info显示错误工作目录
Perforce脚本同步目录异常问题
项目目录/opengrok/src/<project_name>下存在.p4config文件,运行Python脚本尝试同步Perforce代码时失败:脚本中os.getcwd()输出正确的项目目录,但p4 info显示当前目录为脚本所在目录,导致客户端识别异常。
原脚本代码:
def sync_perforce_code(project_name, p4port, p4user, p4client, p4view): project_name = project_name project_dir = os.path.join("/opengrok/src", project_name) os.environ["P4CONFIG"] = ".p4config" # Run the p4 sync command try: output = os.chdir(project_dir) print(os.getcwd()) subprocess.run(["p4", "info"]) print("Successfully synced Perforce code") except subprocess.CalledProcessError as e: print(e)
p4 info错误输出示例:
User name: my_username Client name: hostname (illegal) Client host: hostname.example.com Client unknown. Current directory: /script's directory/sync_code ...
解决方案
1. 用subprocess的cwd参数指定工作目录
放弃os.chdir(),直接在subprocess.run()中通过cwd参数指定p4命令的执行目录,既不改变脚本自身工作目录,又能确保p4在目标目录读取.p4config:
def sync_perforce_code(project_name, p4port, p4user, p4client, p4view): project_dir = os.path.join("/opengrok/src", project_name) os.environ["P4CONFIG"] = ".p4config" try: print(f"Target directory: {project_dir}") subprocess.run(["p4", "info"], cwd=project_dir, check=True) print("Successfully synced Perforce code") except subprocess.CalledProcessError as e: print(e)
2. 传递独立环境变量(可选)
若系统全局存在冲突的P4环境变量,可创建环境变量副本传递给p4命令,避免全局变量干扰.p4config的读取:
def sync_perforce_code(project_name, p4port, p4user, p4client, p4view): project_dir = os.path.join("/opengrok/src", project_name) # 复制当前环境变量,避免修改全局环境 env = os.environ.copy() env["P4CONFIG"] = ".p4config" # 必要时可在此覆盖P4PORT、P4USER等变量 # env["P4PORT"] = p4port try: subprocess.run(["p4", "info"], cwd=project_dir, env=env, check=True) print("Successfully synced Perforce code") except subprocess.CalledProcessError as e: print(e)
3. 验证.p4config文件有效性
确认目标目录下的.p4config包含正确配置,示例:
P4CLIENT=your_valid_client_name P4PORT=your_p4_port_address P4USER=your_p4_username
同时确保文件权限正常,p4命令可读取该文件。
内容的提问来源于stack exchange,提问作者undefined
相关产品推荐
相关产品推荐

