Python 脚本在 Windows 的 Ubuntu 子系统中失败 - ModuleNotFoundError
Python script fails in Ubuntu subsystem in Windows - ModuleNotFoundError
您好,我正在尝试在 Windows 中启用的 Ubuntu 子系统中执行 python 脚本。
我想这样做的原因是因为我每天安排 crontab
到 运行 这个脚本。
我遇到的问题是,当我在正常 Windows 终端上 运行 时通过的相同脚本在 ubuntu 终端上失败。在这两种情况下,我都使用 Pyhon3 执行。
问题似乎与我处理 json 数据的方式有关。
代码的作用是获取 API 调用 returns 的响应,在 tablib
的帮助下将其内容添加到 excel 文件中 library 我已经安装了。
call_api_call
方法returnsjson这种形式:return json.loads(response.text)
代码的相关部分:
dataset_list = call_api_call()
data = tablib.Dataset()
data.json = json.dumps(dataset_list)
data_export = data.export('xlsx')
filename = os.path.dirname(os.path.realpath(__file__)) + '_' + str(datetime.date.today()) + '.xlsx'
with open(filename, 'wb') as f:
f.write(data_export) # write issues to the xlsx file
运行 来自 Windows 在 Ubuntu 终端上:
执行方式:
python3 /mnt/c/Users/marialena/source/repos/GitLab_Issues/gitlab.py -vs
输出:
Traceback (most recent call last):
File "/mnt/c/Users/marialena/source/repos/GitLab_Issues/gitlab.py", line 93, in <module>
data1 = json.loads(list_with_bugs)
File "/usr/lib/python3.6/json/__init__.py", line 348, in loads
'not {!r}'.format(s.__class__.__name__))
TypeError: the JSON object must be str, bytes or bytearray, not 'dict'
运行 来自 Windows 普通终端:
执行方式:
PS C:\Users\marialena\source\repos\GitLab_Issues> python .\gitlab.py
输出:
没有错误,文件创建没有问题。
更新:
我在 unix 子系统中使用以下命令将 python 从 3.6.8
更新为 3.7.3
以匹配 windows 版本(在我再次安装 tablib
之后 python3.7 -m pip install tablib
)
python3.7 /mnt/c/Users/marialena/source/repos/GitLab_Issues/gitlab.py -vs
当我现在执行我得到的脚本时
Traceback (most recent call last):
File "/mnt/c/Users/marialena/source/repos/GitLab_Issues/gitlab.py", line 93, in <module>
data.json = json.dumps(list_with_bugs)
File "/usr/local/lib/python3.7/dist-packages/tablib/formats/_json.py", line 39, in import_set
dset.dict = json.loads(in_stream)
File "/usr/local/lib/python3.7/dist-packages/tablib/core.py", line 381, in _set_dict
if isinstance(pickle[0], list):
KeyError: 0
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
from apport.fileutils import likely_packaged, get_recent_crashes
File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
from apport.report import Report
File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
import apport.fileutils
File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
from apport.packaging_impl import impl as packaging
File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 24, in <module>
import apt
File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'
Original exception was:
Traceback (most recent call last):
File "/mnt/c/Users/marialena/source/repos/GitLab_Issues/gitlab.py", line 93, in <module>
data.json = json.dumps(list_with_bugs)
File "/usr/local/lib/python3.7/dist-packages/tablib/formats/_json.py", line 39, in import_set
dset.dict = json.loads(in_stream)
File "/usr/local/lib/python3.7/dist-packages/tablib/core.py", line 381, in _set_dict
if isinstance(pickle[0], list):
KeyError: 0
apt_pkg
的回溯处有一个 ModuleNotFoundError
。
您可以尝试重新安装该软件包,并检查它是否有效。
sudo apt-get remove --purge python-apt
sudo apt-get install python-apt
您好,我正在尝试在 Windows 中启用的 Ubuntu 子系统中执行 python 脚本。
我想这样做的原因是因为我每天安排 crontab
到 运行 这个脚本。
我遇到的问题是,当我在正常 Windows 终端上 运行 时通过的相同脚本在 ubuntu 终端上失败。在这两种情况下,我都使用 Pyhon3 执行。
问题似乎与我处理 json 数据的方式有关。
代码的作用是获取 API 调用 returns 的响应,在 tablib
的帮助下将其内容添加到 excel 文件中 library 我已经安装了。
call_api_call
方法returnsjson这种形式:return json.loads(response.text)
代码的相关部分:
dataset_list = call_api_call()
data = tablib.Dataset()
data.json = json.dumps(dataset_list)
data_export = data.export('xlsx')
filename = os.path.dirname(os.path.realpath(__file__)) + '_' + str(datetime.date.today()) + '.xlsx'
with open(filename, 'wb') as f:
f.write(data_export) # write issues to the xlsx file
运行 来自 Windows 在 Ubuntu 终端上:
执行方式:
python3 /mnt/c/Users/marialena/source/repos/GitLab_Issues/gitlab.py -vs
输出:
Traceback (most recent call last):
File "/mnt/c/Users/marialena/source/repos/GitLab_Issues/gitlab.py", line 93, in <module>
data1 = json.loads(list_with_bugs)
File "/usr/lib/python3.6/json/__init__.py", line 348, in loads
'not {!r}'.format(s.__class__.__name__))
TypeError: the JSON object must be str, bytes or bytearray, not 'dict'
运行 来自 Windows 普通终端:
执行方式:
PS C:\Users\marialena\source\repos\GitLab_Issues> python .\gitlab.py
输出: 没有错误,文件创建没有问题。
更新:
我在 unix 子系统中使用以下命令将 python 从 3.6.8
更新为 3.7.3
以匹配 windows 版本(在我再次安装 tablib
之后 python3.7 -m pip install tablib
)
python3.7 /mnt/c/Users/marialena/source/repos/GitLab_Issues/gitlab.py -vs
当我现在执行我得到的脚本时
Traceback (most recent call last):
File "/mnt/c/Users/marialena/source/repos/GitLab_Issues/gitlab.py", line 93, in <module>
data.json = json.dumps(list_with_bugs)
File "/usr/local/lib/python3.7/dist-packages/tablib/formats/_json.py", line 39, in import_set
dset.dict = json.loads(in_stream)
File "/usr/local/lib/python3.7/dist-packages/tablib/core.py", line 381, in _set_dict
if isinstance(pickle[0], list):
KeyError: 0
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
from apport.fileutils import likely_packaged, get_recent_crashes
File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
from apport.report import Report
File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
import apport.fileutils
File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
from apport.packaging_impl import impl as packaging
File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 24, in <module>
import apt
File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'
Original exception was:
Traceback (most recent call last):
File "/mnt/c/Users/marialena/source/repos/GitLab_Issues/gitlab.py", line 93, in <module>
data.json = json.dumps(list_with_bugs)
File "/usr/local/lib/python3.7/dist-packages/tablib/formats/_json.py", line 39, in import_set
dset.dict = json.loads(in_stream)
File "/usr/local/lib/python3.7/dist-packages/tablib/core.py", line 381, in _set_dict
if isinstance(pickle[0], list):
KeyError: 0
apt_pkg
的回溯处有一个 ModuleNotFoundError
。
您可以尝试重新安装该软件包,并检查它是否有效。
sudo apt-get remove --purge python-apt
sudo apt-get install python-apt