AttributeError:当从Windows Linux子系统使用Ubuntu Bash时,模块“os”没有属性“fork”

2024-09-25 08:27:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在我的Windows10机器上使用GitHub中的一些代码。我经常遇到的错误是:

AttributeError: module 'os' has no attribute 'fork'

我查了一下,发现Windows不支持os.fork()调用,所以我尝试寻找在Windows机器上获取bash的方法(将来可能需要bash来编写其他脚本)。我发现了Windows Linux子系统,它听起来非常适合这个。我安装了WLS1,并从微软商店获得了Ubuntu。Bash看起来像预期的那样工作,但是这个脚本仍然在Bash中抛出相同的错误

几年前我发现了一个类似的问题。公认的答案是建议在虚拟机上运行Linux应用程序,我认为这正是我正在做的(对吗?)。有人知道我如何让这个脚本工作吗?(顺便说一句,我知道它可以工作,因为我以前在工作时的Linux机器上运行过它。)


编辑:这可能是另一个问题的症状

我认为这意味着Ubuntu WSL1使用的是python的Linux路径:

在Powershell中:Get-Command python给我C:\Users\myname\AppData\Local\Microsoft...

在Ubuntu中:which python给我/usr/bin/python3

在Powershell中,如果我尝试使用wellmap .\wellmap-text.toml读取.toml文件,就会出现“not In Path”错误(在我尝试设置机器时,我已经看到了很多错误,我不知道如何正确地将内容添加到路径中,或者这样做可能会破坏某些内容)

wellmap : The term 'wellmap' is not recognized as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ wellmap .\wellmap-text.toml
+ ~~~~~~~
    + CategoryInfo          : ObjectNotFound: (wellmap:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

在Ubuntu WSL上,运行wellmap ./wellmap-text.toml会给我一个command not found错误

因为我知道wellmap.exe的路径,所以我尝试直接给Powershell和Ubuntu这个路径,并且是超显式的。这就是我得到module 'os' has no attribute 'fork'错误的地方

在Powershell中:

& “C:\Users\myname\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\Scripts\wellmap.exe” \Users\myname\Desktop\wellmap-text.toml

这个错误是:

Traceback (most recent call last): File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.496.0_x64__qbz5n2kfra8p0\lib\runpy.py", line 197, in _run_module_as_main return _run_code(code, main_globals, None, File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.496.0_x64__qbz5n2kfra8p0\lib\runpy.py", line 87, in run_code exec(code, run_globals) File "C:\Users\myname\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\Scripts\wellmap.exe_main.py", line 7, in File "C:\Users\myname\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\wellmap\plot.py", line 101, in main if os.fork() != 0: AttributeError: module 'os' has no attribute 'fork'

在Ubuntu中:

/mnt/c/Users/myname/AppData/Local/Packages/PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0/LocalCache/local-packages/Python39/Scripts/wellmap.exe /mnt/c/Users/myname/Desktop/wellmap-test.toml

还有同样的错误:

Traceback (most recent call last): File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.496.0_x64__qbz5n2kfra8p0\lib\runpy.py", lin e 197, in _run_module_as_main return _run_code(code, main_globals, None, File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.496.0_x64__qbz5n2kfra8p0\lib\runpy.py", lin e 87, in run_code exec(code, run_globals) File "C:\Users\myname\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-package s\Python39\Scripts\wellmap.exe_main.py", line 7, in File "C:\Users\myname\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-package s\Python39\site-packages\wellmap\plot.py", line 101, in main if os.fork() != 0: AttributeError: module 'os' has no attribute 'fork'


Tags: runinpyosmain错误codefork
3条回答

您添加到更新问题中的信息突出显示了一个可能的问题。你说在Ubuntu中,你正在运行:

/mnt/c/Users/myname/AppData/Local/Packages/PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0/LocalCache/local-packages/Python39/Scripts/wellmap.exe /mnt/c/Users/myname/Desktop/wellmap-test.toml

如果是这样,那么您仍然在Ubuntu下运行Windows版本的wellmap.exe。因为它运行的是exe,所以WSL将控制权传递回Windows(它比这个更重要)。无论如何,如果您正在运行.exe,那么它将在Windows Python环境中运行,而不是在Linux Python下运行

让我们尝试实际安装和运行Linux Python wellmap。我们可以在虚拟环境中这样做,以防止更改默认的Python环境。在Ubuntu中:

cd ~ # Or whever you want to set up this virtual environment
python -m venv wellmap-venv # since we've already confirmed that this points to the Linux version
. wellmap-venv/bin/activate
pip install wellmap

然后用wellmap文件尝试.toml(没有扩展名)。该.toml文件仍然可以位于Windows路径中,而不会产生影响

您可能需要指定脚本、WSL上的Linux发行版(和版本)。刚刚用Python3.8.5在WSL2上的Ubuntu20.04上试用过。下面几行

import os
os.fork()

干得好

由于您提到您首先尝试在Windows上的Python上运行它,因此您的Windows Python版本可能仍然优先于您的Linux Python

which python3检查Python位置。您可能会发现它指向Windows版本

在Ubuntu中检查你的路径。您可能会发现Windows Python版本已经存在,并且它的优先级高于Linux版本。这是因为WSL“有益地”将Windows路径前置到Linux路径,以允许您在Linux下访问Windows应用程序和实用程序。这在大多数情况下很有用,但在同时安装Windows和Linux版本的工具时可能会导致问题

假设是这样的话,我知道有很多变通方法。其中三个,您可以在my answer here中阅读关于WSL上npm的类似问题。它们都和nodejs/npm一样适用于Python

当然,您也可以在启动应用程序时指定Linux Python的完整路径/usr/bin/python3

相关问题 更多 >