在 venv / pyvenv 中没有 activate_this.py 文件
问题原因:venv/pyvenv模块没有提供activate_this.py文件。
解决方法:可以从virtualenv中借用activate_this.py文件,并将其放置在预期位置(virtualenv_path/bin/activate_this.py),然后使用它。虽然这个方法可以正常工作,但是需要注意的是,Python 3的virtualenv文档已经过时了,因为它们声称你可以使用execfile函数,而这个函数在Python 3中已经不存在了。在Python 3中,可以使用以下兼容的替代方法:
activator = 'some/path/to/activate_this.py' # 从virtualenv中获取,不需要修改,因为它是相对路径 with open(activator) as f: exec(f.read(), {'__file__': activator})
activate_this.py文件并没有进行任何神奇的操作,因此你也可以手动进行相同的更改来实现相同的效果,例如调整PATH、sys.path、sys.prefix等。但是在这种情况下,借用activate_this.py文件会更加简单。
一个用户提到,他创建了一个名为.venv的虚拟环境,并创建了一个名为file.py的文件,其中包含了上述代码,只是activate_this.py文件的路径进行了更改。然后他运行了python3 file.py命令,但是他的提示符没有变成(.venv)...。他想知道他做错了什么。
另一个用户解释道,activate_this.py文件是用于在Python脚本中激活虚拟环境的方法,只在脚本的生命周期内有效(以及它的子进程)。它无法直接改变运行它的shell环境(它是一个子进程,无法改变父进程的环境)。要持久性地改变shell本身,唯一的方法是使用正常的方式,即source /path/to/venv/bin/activate(根据所使用的shell添加适当的文件扩展名)。activate_this.py文件则是用于特殊情况,当脚本必须自身激活虚拟环境时使用。
第一个用户表示感谢第二个用户的解答,并提到之前看到的一个回答似乎与此不同,该回答链接为stackoverflow.com/a/14792407/8691571。他表示如果第二个用户是正确的,他将使用一个bash脚本来包装他的Python脚本,并从bash脚本中传递路径并进行source操作。
第二个用户解释道,那个回答涉及三个层次:1)非Python shell,2)最初启动的Python进程,3)使用subprocess启动的可选子Python进程。activate_this.py文件用于在以下情况下使用:不希望在第一层中使用source命令,也不希望编写一个包装的bash脚本来进行source操作,同时需要第二层在虚拟环境中,即使在启动时它还没有被激活(这就是那个回答的结尾所说的)。该回答的其余部分则关注于第二层仍然在虚拟环境之外,而第三层在虚拟环境中。
第一个用户再次感谢第二个用户的解答,并表示这样可以节省他很多时间,因为他很固执,本来会继续尝试以为自己做错了什么。