无法通过wsl.exe运行命令



我正试图从python脚本运行以下命令:

def raw(path_avd_py, path_avd, snp_name, out_file):
if OS == 'Windows':
cmd_raw = f"wsl.exe -e sh -c 'python3 {path_avd_py} -a {path_avd} 
-s {snp_name} -o {out_file}'"
else:
cmd_raw = f'python3 {path_avd_py} -a {path_avd} -s {snp_name} -o {out_file}'
subprocess.Popen(cmd_raw, shell=True)
time.sleep(25)
return None

def idiffer(i_path, raw_1, raw_2, path, state):
if OS == 'Windows':
cmd_idiff = f"wsl.exe -e sh -c 'python3 {i_path} {raw_1} {raw_2}'"
[...]
file = os.path.join(path, f'{state}.idiff')
with open(file, 'w') as f:
subprocess.Popen(cmd_idiff, stdout=f, text=True)

如果我在python shell(Powershell(中使用subprocess.run执行cmd_raw,那么一切都正常。如果我尝试通过脚本运行此程序,则会使用不同的shell出现此异常:

-e sh:avdecrypt master\avdecrypt.py:1:语法错误:未终止的带引号字符串

-e bash:avdecrypt master\avdecrypt.py:-c:行0:查找匹配的"时出现意外EOFavdecrypt-master\avdecrypt.py:-c:第1行:语法错误:文件意外结束

我已经尝试了os.system,os.run([list](没有更改。谢谢你的帮助!

对于那些有类似问题的人,我找到了一个对我有效的解决方案:显然,用一些argv调用脚本必须在一个单引号中,并且可以通过run执行(在我的情况下很重要,因为进程必须终止(。这导致了一种类似于的形式

cmd = ['wsl.exe', '-e', 'bash', '-c', '-a foo -b bar [...]']
subprocess.run(cmd, shell=True)

Lib-shlex在这里很有帮助,格式化字符串就像子流程需要它一样:

cmd_finished = shlex.split(cmd)

https://docs.python.org/3/library/shlex.html

最新更新