我有一个 python 包,当我以 启动时,它可以正常运行。python -m myproject
但是,当我以 启动时nohup python -m myproject
,我得到一个ImportError
。此外,当我以 启动时nohup python3 -m myproject
,它可以正常工作。
问题似乎是我的python
别名为 python3,而 nohup 不知何故使用了非默认的 python。为什么会这样?
答案1
你的壳(可能是 bash)分配了一个别名,这样每当您python
在命令开头输入时,它都会将其更改为/usr/bin/python3
。我很难说你为什么有这个别名。可能是你的系统管理员希望每个人都默认使用 Python 3 而不是 Python 2,而这是实现这一目标的尝试。
您的/usr/bin/python
是指向 Python 2 二进制文件的符号链接。这似乎很正常;在很多 Linux 发行版(例如 Debian)中,python
引用 Python 2 是很常见的,因为 Python 3 还不够流行。但情况并非总是如此;在 Arch Linux 上,python
引用的是 Python 3。
因此,如果让我猜的话,我会说您系统的包管理器安装了从/usr/bin/python
到的符号链接/usr/bin/python2.7
,因为它的策略是让大家默认使用 Python 2。但是,在配置您的系统时有发言权的其他人决定他们希望默认使用 Python 3,因此他们安装了这个别名。
如您所见,别名并不总是有效。当您输入时nohup python
,shell 会不是展开你的别名,而只是将字符串python
作为参数传递给nohup
命令。nohup
然后命令必须弄清楚这python
意味着什么,它所做的就是查看你的 PATH;它不知道你的 shell 别名。它会找到/usr/bin/python
并最终为你运行 Python 2。
您可以阅读 shell 手册,了解它在启动时运行哪些文件(例如 .bashrc 等)。这将帮助您找出 shell 为何有 Python 3 的别名。查找如下行:
alias python=python3
您可以阅读有关系统的包管理器的信息,以了解如何查看哪些文件属于哪些包,这可以帮助您弄清楚为什么 Python 2 有一个符号链接。只需询问包管理器哪个包拥有该/usr/bin/python
链接。
答案2
这意味着你在 python2 中安装了 lib,而不是在 python3 中。如果你安装了类似的包 sudo pip 安装然后默认安装在python2中,但是如果你安装sudo pip3 安装然后它安装在 python3 中
您可以像 python3.6 一样使用 pip3.6。