在我的例子中,应用程序是OpenFoam,但这种情况也发生在其他Linux程序中.

我有一个py脚本(run_test. py)用Windows VS Code编写:

import subprocess

command = "wsl python3 /mnt/wslg/distro/home/j/test.py"
subprocess.Popen(command, shell=True)

运行另一个脚本py(test.py),在我的WSL中用Linux VS Code编写:

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启动www.example.com时,一切都工作正常,但是当我运行"run_test. py"时,我得到了错误/bin/sh: 1: cd: can't cd to /airfopt

相反,如果我写完整路径/mnt/wslg/distro/root/OpenFOAM/root-11/run/airfopt,新的错误是/bin/sh: 1: foamRun: not found.

我认为因为run_www.example.com在Windows环境下运行test.py,而不是Linux环境下运行. 我想从run_test. py运行www.example.com,但在Linux环境下运行.

运行www.example.com文件也会出现同样的错误.

这是我第一次使用WSL,因为我需要OpenFoam Linux(不是blueCFD等)并将其连接到Windows Python脚本. 我在Google上搜索,这里…我还问了chatgpt,但没有得到一个好的答案.

感谢任何人谁可以帮助我!

推荐答案

Short version

  • 判断您的~/.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使用了internally,并且在将来可能会改变(它在过go 已经改变了很多次). 不能保证/mnt/wslg/distro在future 的WSL版本中继续指向发行版的根目录.


More detail and other options

最有可能的是,$FOAM_RUN定义在你的~/.bashrc或等同. 此启动配置仅在您启动interactive shell时提供. 当第一个Python脚本运行时:

wsl python3 /mnt/wslg/distro/home/j/test.py

这里有一个对bash -c的隐式调用(或者你的默认shell是什么):

wsl -e bash -c 'python3 /mnt/wslg/distro/home/j/test.py'"

默认情况下,当使用-c执行命令行时,Bash会以交互方式运行not,因此~/.bashrc永远不会被读取. 在some distributions上,库存~/.bashrc甚至进一步try 防止交互式使用.

你没有提到如果运行:

wsl python3 /mnt/wslg/distro/home/j/test.py

...从PowerShell或CMD开始. 如果我的答案是正确的,这应该会失败,并传达同样的信息.

你有几个 Select :

  • 首先,如果您需要在非交互式shell中使用$FOAM_RUN,那么可能是正确的方法,将其定义从~/.bashrc移动到~/.profile. login枚炮弹. 然后让WSL告诉bash作为一个登录shell运行,以便处理该文件. 上面的"简短版本"中的命令行:

    • 使用wsl -e bash显式启动Bash.这样我们就可以通过 Select ...
    • -lc:l强制使用一个登录shell,这在启动时强制使用.profile.
    • -c用于在shell中执行下一个命令(Python脚本调用).

  • 另一种 Select 是将变量定义保留为~/.bashrc,然后将命令行更改为:

    command = "wsl -e bash -ic 'python3 /mnt/wslg/distro/home/j/test.py'"
    

    唯一不同的是,我们现在开始Bash时使用-i而不是-l.

    这告诉Bash您正在启动一个"交互式"shell和源代码~.bashrc. 我通常不认为这是一个好主意,因为你可以假设交互式shell可以处理(显然)交互式命令—即,那些需要投入的人.

    如果您的~/.bashrc中有需要输入的命令,那么Python脚本将暂停并等待输入. 这在subprocess电话里可能行不通—我记不清了. 无论如何,这可能不是您希望在测试脚本中发生的事情.


  • 最后,"真正和适当"的最佳方法可能是:

    • Windows(调用)Python环境中定义$FOAM_RUN
    • 此外,定义(或修改)WSLENV变量,以包括FOAM_RUN作为环境变量,您希望从Windows进程传递到WSL环境.

    参见Share Environment Vars between WSL and Windows和相应的WSL Doc Page以了解更多信息.

Python相关问答推荐

使用pandas、matplotlib和Yearbox绘制时显示错误的年份

将numpy数组存储在原始二进制文件中

连接两个具有不同标题的收件箱

如何将双框框列中的成对变成两个新列

log 1 p numpy的意外行为

如何从.cgi网站刮一张表到rame?

如何在WSL2中更新Python到最新版本(3.12.2)?

在vscode上使用Python虚拟环境时((env))

从spaCy的句子中提取日期

Django RawSQL注释字段

如何从需要点击/切换的网页中提取表格?

基于另一列的GROUP-BY聚合将列添加到Polars LazyFrame

为什么t sns.barplot图例不显示所有值?'

如何获得3D点的平移和旋转,给定的点已经旋转?

如何在验证文本列表时使正则表达式无序?

比较两个有条件的数据帧并删除所有不合格的数据帧

设置索引值每隔17行左右更改的索引

Pandas:使列中的列表大小与另一列中的列表大小相同

如何通过特定导入在类中执行Python代码

try 使用RegEx解析由标识多行文本数据的3行头组成的日志(log)文件