在我的例子中,应用程序是 OpenFoam,但其他 Linux 程序也会发生这种情况。
我有一个用 Windows VS Code 编写的 py 脚本(run_test.py):
import subprocess
command = "wsl python3 /mnt/wslg/distro/home/j/test.py"
subprocess.Popen(command, shell=True)
运行在我的 WSL 中的 Linux VS Code 中编写的另一个脚本 py (test.py):
import subprocess
command = "cd $FOAM_RUN/airfopt && foamRun"
process=subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, error = process.communicate()
if output:
print("Output:", output.decode())
if error:
print("Error:", error.decode())
当我通过 Linux VS Code 启动 test.py 时,一切正常,但是当我运行“run_test.py”时,出现错误
/bin/sh: 1: cd: can't cd to /airfopt
相反,如果我写了完整路径
$FOAM_RUN/airfopt
,新错误是/mnt/wslg/distro/root/OpenFOAM/root-11/run/airfopt
。我想是因为run_test.py在Windows环境下运行test.py而不是Linux环境。
我想从 run_test.py 运行 test.py 但在 Linux 环境下。
运行 test.sh 文件也出现同样的错误。
这是我第一次使用 WSL,因为我需要 OpenFoam Linux(不是 blueCFD 等)并将其连接到 Windows python 脚本。 我在谷歌上搜索,在这里...我还问了chatgpt,但没有得到好的答案。
感谢任何可以帮助我的人!
/bin/sh: 1: foamRun: not found
、
~/.bashrc
和 ~/.bash_profile
以确定 ~/.profile
的设置位置。
$FOAM_RUN
中定义,则将其定义移至
~/.bashrc
~/.profile
旁注:
command = "wsl -e bash -lc 'python3 /mnt/wslg/distro/home/j/test.py'"
是有点奇怪的路径。虽然它有效,但它应该与较短的
/mnt/wslg/distro/home/j/test.py
相同。 /home/j/test.py
安装座由 WSLg 内部使用,并且将来可能会发生变化(过去已经更改过多次)。无法保证
/mnt/wslg
在未来的 WSL 版本中将继续指向发行版的根目录。
更多细节和其他选项/mnt/wslg/distro
是在您的
$FOAM_RUN
或同等定义中定义的。仅当您启动 interactiveshell 时才会获取此启动配置。当第一个 Python 脚本运行时:
~/.bashrc
首先有一个对
wsl python3 /mnt/wslg/distro/home/j/test.py
的隐式调用(或者任何你的默认 shell ):
bash -c
默认情况下,当使用
wsl -e bash -c 'python3 /mnt/wslg/distro/home/j/test.py'"
执行命令行时,Bash
not不会以交互方式运行,因此
-c
永远不会被读取。在某些发行版上,库存
~/.bashrc
甚至进一步尝试阻止交互使用。您没有提及是否运行:
~/.bashrc
...可通过 PowerShell 或 CMD 运行。如果我的答案是正确的,这应该会失败并显示相同的消息。
您有几个选择:
wsl python3 /mnt/wslg/distro/home/j/test.py
在非交互式 shell 中可用,那么可能正确的方法是将其定义从
$FOAM_RUN
移至 ~/.bashrc
。后者是针对 loginshell 读取的。然后让 WSL 告诉
~/.profile
作为登录 shell 运行,以便处理该文件。上面“简短版本”中的命令行:
使用 bash
wsl -e bash
-lc
强制登录 shell,这会在启动时强制获取 l
。.profile
-c
中,然后将命令行更改为:
~/.bashrc
唯一的区别是我们现在使用
command = "wsl -e bash -ic 'python3 /mnt/wslg/distro/home/j/test.py'"
而不是
-i
来启动 Bash。这告诉 Bash 您正在启动一个“交互式”shell 和源代码 -l
。我通常认为这不是一个好主意,因为您
应该能够假设交互式 shell 可以处理(显然)交互式命令 - 即那些需要输入的命令。 如果您的
~.bashrc
中碰巧有需要输入的命令,那么您的 Python 脚本将暂停并等待输入。这在
~/.bashrc
通话中可能不起作用 - 我记不清了。无论如何,这可能不是您希望在测试脚本中发生的情况。
在
subprocess
还定义(或修改) $FOAM_RUN
WSLENV
作为要从 Windows 进程传递到 WSL 环境的环境变量。
以及相应的 WSL 文档页面了解更多信息。