从 Windows python 脚本在 WSL 上运行 Linux 应用程序

问题描述 投票:0回答:1

在我的例子中,应用程序是 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,但没有得到好的答案。

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

python windows-subsystem-for-linux connect openfoam
1个回答
0
投票

    检查您的
  • /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
或同等定义中定义的。仅当您启动
interactive
shell 时才会获取此启动配置。当第一个 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
    。后者是针对
    login
    shell 读取的。然后让 WSL 告诉 ~/.profile 作为登录 shell 运行,以便处理该文件。上面“简短版本”中的命令行:
    
    

    使用
      bash
    • 显式启动 Bash。这使我们能够传递选项......
    • wsl -e bash
    • -lc
      强制登录 shell,这会在启动时强制获取
      l
    • .profile
    • 用于在 shell 中执行下一个命令(您的 Python 脚本调用)。
      
      

    另一个选项是将变量定义保留在
  • -c

    中,然后将命令行更改为:

    ~/.bashrc

    唯一的区别是我们现在使用 
    command = "wsl -e bash -ic 'python3 /mnt/wslg/distro/home/j/test.py'"

    而不是

    -i
    来启动 Bash。
    这告诉 Bash 您正在启动一个“交互式”shell 和源代码 

    -l

    。我通常认为这不是一个好主意,因为您

    应该
    能够假设交互式 shell 可以处理(显然)交互式命令 - 即那些需要输入的命令。 如果您的

    ~.bashrc

    中碰巧有需要输入的命令,那么您的 Python 脚本将暂停并等待输入。这在

    ~/.bashrc
    通话中可能不起作用 - 我记不清了。无论如何,这可能不是您希望在测试脚本中发生的情况。
    
    


    最后,“正确”的最佳方法可能是:
    • Windows
    • (调用)Python环境中定义
      subprocess
      还定义(或修改)
    • $FOAM_RUN
    • 变量以将
      WSLENV
      作为要从 Windows 进程传递到 WSL 环境的环境变量。
      
      
    • 请参阅
    在 WSL 和 Windows 之间共享环境变量

    以及相应的 WSL 文档页面了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.