- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 Python 软件,其中包含一个配置文件和一个联机帮助页。要安装这些,我的 setup.py
中有以下行(如 http://docs.python.org/2/distutils/setupscript.html#installing-additional-files 中所述):
data_files = [('/etc/foo', ['foo.conf']), ('/usr/share/man/man1', ['foo.1'])]
当我想以 root 身份使用 python setup.py install
安装软件时,这工作得很好,但在 virtualenv 中当然会失败,因为不允许用户写入 /etc
和 /usr/share/man
。
解决该问题的最佳做法是什么?在当前环境中检查 VIRTUAL_ENV
并且根本不安装这些文件?该软件将在本地目录中查找 foo.conf
,因此应该没有问题。用户会错过联机帮助页,但无论如何都没有安装它的明智方法,因为 man
不会在 virtualenv 附近的任何地方寻找它。
最佳答案
最终看来您的问题实际上是关于如何检测正在运行的 Python 是否在 virtualenv 中。要弄清楚这个问题,我们必须了解 virtualenv
的实际工作原理。
当你在 virtualenv 中运行 activate
脚本时,它会做两件事:
PATH
环境变量以包含来自 virtualenv 的 bin
目录,这样当您运行 python
时,来自 virtualenv 的二进制文件将运行。VIRTUAL_ENV
以便激活脚本本身可以跟踪激活。直接从 virtualenv 运行 python
是完全可以接受的,并且在运行时 python
根本不使用 VIRTUAL_ENV
变量。相反,它确定包含正在运行的 python
二进制文件的目录,并使用父目录作为其“前缀”。
您可以通过导入sys
模块并引用sys.prefix
来确定系统的前缀。但是,当 virtualenv 未 激活时,依赖此值将是一个坏主意,因为这是 Python 的构建时设置,可以轻松自定义,并且肯定会有所不同平台。
但是,当 Python 从 virtualenv 前缀运行时与其编译前缀运行时,Python 确实有 一个 轻微的运行时差异:sys
包有一个额外的变量 real_prefix
返回编译到 Python 二进制文件中的前缀。因此,可以使用它来识别 Python 在非默认位置运行,这很可能意味着它是从 virtualenv 运行的:
import sys
if getattr(sys, "real_prefix", None) is not None:
print "Maybe in a virtualenv"
else:
print "Probably not in a virtualenv"
然而,即使这不是一门精确的科学。所有这一切真正告诉你的是 python 二进制文件不在编译时指定的位置。它不会告诉您当前用户是否有权写入 /usr/share/man
- 在某些(可能是边缘)情况下,这不会给您正确的答案:
如果用户从他的主目录中的源代码编译了他自己的 Python,并且其编译前缀是 /home/johnd/local-python
那么 real_prefix
获胜未设置,但用户仍有对其 Python lib
目录的写入权限,并且可能没有对 /etc
或 的写入权限/usr/share/man
同样,在某些系统上,管理员可能已将 /usr/lib/python2.7
的组写入权限授予特定的应用程序开发人员组,以便他们可以安装 Python 模块,但未授予他们对其他系统文件的写入权限。
所以我认为最后你能做的最好的事情就是启发式,最好避免在 data_files
中为你希望在 virtualenv 中使用的任何模块使用绝对路径。一种妥协可能是将您的模块简单地分成两个分布,一个代表可本地化的源文件,另一个代表系统范围的配置以使其运行。后者可以依赖于前者,因此用户仍然可以轻松安装它,但是那些使用 virtualenv
的用户可以选择直接使用另一个前者。
关于python - 如何在包安装期间测试 Python 是否从 virtualenv 运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15466253/
我听说最好不要从您系统的 Perl 版本所在的 CPAN 安装模块。我知道如何使用命令行安装模块,我只是想知道是否有办法将 CPAN 与系统核心 Perl 分开。 我应该: 下载源代码并专门为这些模块
我听说最好不要从系统的 Perl 版本所在的 CPAN 安装模块。我知道如何使用命令行安装模块,我只是想知道是否有办法将 CPAN 与系统的核心 Perl 分开。 我应该: 下载源代码并专门为这些模块
单独安装 electron 与通过 electron-builder 安装有什么区别?我正在使用 React 构建一个 Electron 应用程序,并且已经找到了一些教程。它们安装 Electron
两者安装有什么区别?我按照安装页面上的说明在全局范围内安装了 webpack,然后我转到了入门指南,据说在那里可以在本地安装 webpack-cli。 CLI = Command Line Inter
我在 OS X Yosemite 上用 PHP 安装了默认的 Apache 服务器,安装了 pear,用 brew 安装了 Solr (brew install solr),现在我正在尝试使用 PEC
我解压并编译了 Ruby 2.1 并安装了几个支持工具。 但是当我安装了 libssl-dev 时,OpenSSL 不会安装。 我在支持 openssl 时遇到这个错误: make: *** No r
我在 android studio 2.3.1 和 gradle 3.2 中设计了 2 到 3 个应用程序。当我从它运行应用程序到任何设备或模拟器时,一切都工作正常。但是当我从构建文件夹中获取该 ap
我注意到我正在读一本书提到通过 apt-get 安装 numpy 和 opencv apt-get install python-numpy python-opencv 但我可以通过以下方式在 pip
我正在尝试在 Windows 8.1 上安装 ansicon。我提取了文件并达到了我需要调用 ansicon -i 的级别。当我在 cmd 中输入此内容并运行 python 脚本时效果很好,但是当我通
我有 linux MINT 17.3 Kernel 4.4.0-81 所有更新可用。 (由于不同的原因,我无法迁移到更新版本的 ubuntu/mint) 我已经通过 PPA 安装了 FFMPEG(不是
尝试在本地运行我的应用程序时出现错误: 我只在 chrome 浏览器中收到此错误。我尝试过不同的东西,但我不确定为什么它是 Chrome 特定的。 最佳答案 我怀疑这不是 Firebase 问题,而是
这是我第一次开发 AngularJS 应用程序并使用脚手架工具 Yeoman ( http://yeoman.io/ )。我想对我的一些图标使用 fontawesome ( http://fortaw
我知道您通常“应该”$ pip install 如果包没有 brew ,但如果有一个你想安装的 python 包,你可以使用 $ pip install或 $ brew install为了?例如,通过
我正在尝试通过 RVM 安装 Ruby 1.9.3。然而,当谈到安装 RubyGems 时,我得到了这个: curl: (22) The requested URL returned error: 4
我是真正提出问题的新手,但你去吧。 我一直在尝试按照安装指南添加 dnsname: https://github.com/containers/dnsname https://github.com/c
Studio更新至0.4.0 建筑产量为“需要1.8版Gradle”;将设置设置为1.8 bin目录; 建立 “要求1.9级”;将设置设置为1.9 bin; 建立 “要求1.8级” 啊。不知道该怎么做
我刚刚注意到 kernel.org 因维护而停机。是否有使用不同镜子的不同公式?或者我可以向 Homebrew 软件添加不同的来源(如 bundler ?)? 谢谢你的帮助! 最佳答案 快速解决方法:
当我运行时: peardev install phpunit/PHPUnit 我得到以下信息: No releases available for package "pear.phpunit.de/P
服务器操作系统为Fedora 24. 64bit。 我想安装 Git 2.6.6。 所以下载源码并安装。 此服务器离线。所以我不使用“yum”。 ./configure --prefix=/usr/l
我正在尝试在我自己的服务器(操作系统:Linux Ubuntu Server 12.04)上安装 OpenEdX,但我遇到了同样的错误。谁能帮帮我? TASK: [ insights | insta
我是一名优秀的程序员,十分优秀!