python3.9 venv 中缺少日历模块

Missing calendar module in python3.9 venv

我正尝试在 python3.9 virtualenv 中 运行 一个 python 应用程序。但我收到以下错误:

AttributeError: module 'calendar' has no attribute 'monthlen'

我是这样设置环境的:

sudo apt install python3.9-venv
python3.9 -m venv .venv/
source  .venv/bin/activate

我可以看到 'calendar' 模块没有从虚拟环境中加载。相反,它是从系统 python 安装中加载的:

>>> import calendar
>>> print(calendar.__file__)
/usr/lib/python3.9/calendar.py
>>> 

看起来“calendar”模块应该是 python 安装的一部分,但在虚拟环境中不存在(无法在虚拟环境中找到名称包含“calendar”的任何文件)和无法通过 pip 获得。我怎样才能获得日历模块和我以后可能需要的任何其他标准内置模块?

calendar.monthlen 是一个未记录的 Python 3.7 函数,在 Python 3.8 之后已重命名为 calendar._monthlen 以通知您它是一个“私有”函数并且你不应该依赖它。

代码真的只是:

def _monthlen(year, month):
    return mdays[month] + (month == February and isleap(year))

也和

基本一样
calendar.monthrange(year, month)[1]

plus monthrange 检查 month 是否为有效值。

所以我建议您创建自己的功能完全相同的功能,而不是使用“私有”功能。

您可以随时查看 dir(module) 的可用内容,例如dir(calendar):

['Calendar',
 'EPOCH',
 'FRIDAY',
 'February',
 'HTMLCalendar',       
 'IllegalMonthError',  
 'IllegalWeekdayError',
 'January',
 'LocaleHTMLCalendar', 
 'LocaleTextCalendar', 
 'MONDAY',
 'SATURDAY',
 'SUNDAY',
 'THURSDAY',
 'TUESDAY',
 'TextCalendar',       
 'WEDNESDAY',
 '_EPOCH_ORD',
 '__all__',
 '__builtins__',       
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__spec__',
 '_colwidth',
 '_locale',
 '_localized_day',
 '_localized_month',
 '_monthlen',
 '_nextmonth',
 '_prevmonth',
 '_spacing',
 'c',
 'calendar',
 'datetime',
 'day_abbr',
 'day_name',
 'different_locale',
 'error',
 'firstweekday',
 'format',
 'formatstring',
 'isleap',
 'leapdays',
 'main',
 'mdays',
 'month',
 'month_abbr',
 'month_name',
 'monthcalendar',
 'monthrange',
 'prcal',
 'prmonth',
 'prweek',
 'repeat',
 'setfirstweekday',
 'sys',
 'timegm',
 'week',
 'weekday',
 'weekheader']

当然还有文档:https://docs.python.org/3/library/calendar.html

日历应该随附 Python。看起来您正在正确激活虚拟环境。它并没有抛出一个错误,指出没有日历模块,它只是说它有 no 属性 monthlen。我的猜测是,您尝试 运行 的文件可能被称为 calendar.py 或者它周围的文件被命名为 导入该文件而不是内置模块。