首页 > 解决方案 > Virtualenv myenv 不在 Ubuntu 18.04 上的 exFAT 硬盘上创建虚拟环境

问题描述

我正在使用 python 3.6 学习 Django。我使用 Ubuntu 18.04.2 LTS,这对我来说也是新的。我的点子版本是 9.0.1。我的问题是,当我尝试使用virtualenv myenv命令在我的外部 exFAT 驱动器上创建虚拟环境时,它给出了我在下面分享的错误。但是我可以使用相同的命令在桌面上创建虚拟环境。这个问题对我来说很奇怪。我无法解决问题。你们能帮帮我吗?提前致谢!

示例代码:错误

c@p:/media/c/2NDTB/testpro$ virtualenv myenv
Using base prefix '/usr'
Traceback (most recent call last):
  File "/home/c/.local/lib/python3.6/site-packages/virtualenv.py", line 417, in copyfile
    os.symlink(os.path.realpath(src), dest)
OSError: [Errno 38] Function not implemented: '/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu' -> '/media/c/2NDTB/testpro/myenv/lib/python3.6/config-3.6m-x86_64-linux-gnu'

在处理上述异常的过程中,又出现了一个异常:

Traceback (most recent call last):
  File "/home/c/.local/bin/virtualenv", line 11, in <module>
    sys.exit(main())
  File "/home/c/.local/lib/python3.6/site-packages/virtualenv.py", line 831, in main
    symlink=options.symlink,
  File "/home/c/.local/lib/python3.6/site-packages/virtualenv.py", line 1106, in create_environment
    install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages=site_packages, clear=clear, symlink=symlink)
  File "/home/c/.local/lib/python3.6/site-packages/virtualenv.py", line 1390, in install_python
    copy_required_files(stdlib_dir, lib_dir, symlink)
  File "/home/c/.local/lib/python3.6/site-packages/virtualenv.py", line 1300, in copy_required_files
    copyfile(join(src_dir, fn), join(lib_dir, fn), symlink)
  File "/home/c/.local/lib/python3.6/site-packages/virtualenv.py", line 420, in copyfile
    copy_file_or_folder(src, dest, symlink)
  File "/home/c/.local/lib/python3.6/site-packages/virtualenv.py", line 398, in copy_file_or_folder
    shutil.copytree(src, dest, symlink)
  File "/usr/lib/python3.6/shutil.py", line 359, in copytree
    raise Error(errors)

shutil.Error: [('/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu/libpython3.6m.so', '/media/c/2NDTB/testpro/myenv/lib/python3.6/config-3.6m-x86_64-linux-gnu/libpython3.6m.so', "[Errno 38] Function not implemented: '../../x86_64-linux-gnu/libpython3.6m.so.1' -> '/media/c/2NDTB/testpro/myenv/lib/python3.6/config-3.6m-x86_64-linux-gnu/libpython3.6m.so'"), ('/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu/libpython3.6.so', '/media/c/2NDTB/testpro/myenv/lib/python3.6/config-3.6m-x86_64-linux-gnu/libpython3.6.so', "[Errno 38] Function not implemented: '../../x86_64-linux-gnu/libpython3.6m.so.1' -> '/media/c/2NDTB/testpro/myenv/lib/python3.6/config-3.6m-x86_64-linux-gnu/libpython3.6.so'")]

标签: pythondjangovirtualenv

解决方案


我在您尝试做的事情中看到了两个问题。第一个较小的问题是 FAT 没有实现符号链接,而 virtualenvs 默认使用符号链接到创建它们的那个版本的 python。您可以尝试virtualenv --always-copy避免使用符号链接。

但是接下来你会遇到第二个更大的问题 你正试图在可移动驱动器上创建一个 virtualenv 以将其移植到某个地方。那是行不通的——virtualenvs 是不可重定位的。当您在不同的地方需要一个 virtualenv 时,您必须重新创建它。要将已安装包的列表从一个 virtualenv 复制到另一个 virtualenv,请在原始 virtualenv 中运行:

pip freeze >requirements.txt

然后将文件移动requirements.txt到另一个地方,创建一个新的 virtualenv 并恢复包:

virtualenv venv2
source venv2/bin/activate
pip install -r requirements.txt

推荐阅读