2013-03-22 47 views
3

我必须将一个Python项目与通过命令行界面使用的脚本一起部署。为了帮助用户,我还包含一个Bash完成文件,该文件被放入/etc/bash_completion.d。不幸的是,作为一个普通用户在安装的时候,因为如果不以root身份运行,如何跳过安装数据文件?

error: could not delete '/etc/bash_completion.d/completion': Permission denied 

pip install -e .工程安装项目,因为书写问题被忽略与pip install project.tar.gz安装源代码发行失败。

现在,有没有办法告诉发布它不应该试图写入数据文件时,它不是作为根执行?

回答

1

non-root optiondistribute这可能是足够智能的发现它不能写入/etc如果你不是超级用户(但我怀疑它)。

你不说怎么你告诉distribute写信给/etc,但你也许可以把这个在try:except:条款(当然,如果这是在setup.py自动化您可能必须采取的那部分做它手动)。

如果你不知道你是否可以运行该脚本(在用户的情况下)之前写/etc,你可以只是做

try: 
     with open('/etc/bash_completion.d/completion', 'w') eo: 
      eo.write('test') 
     data_files = ['completion', '/etc/bash_completion.d/completion'] 
except error: 
     print 'User does not have write access to /etc completion will not work' 
     data_files = [] 

setup(
     ... 
     data_files=data_files, 
     etc... 
) 
+0

我用设置的'了'data_files'关键字参数() '指定完成脚本应该被安装到'/ etc'中。看起来它是真正的唯一选项,如果它以root身份执行或不以root身份执行,则会检查'setup.py'。 – matthias 2013-03-22 10:01:44

+0

我使用类似的方法,但检查'os.geteuid()'是否为0。因此,如果'setup.py'没有以root身份运行,我不需要安装两次。 – matthias 2013-03-22 10:47:22

+0

很高兴你找到了解决方案。上面实际上并没有写入这些文件,它只是在没有写权限的情况下将'data_files'设置为一个空列表(所以当'setup'试图写入时你不会得到这个异常) – danodonovan 2013-03-22 10:55:58

相关问题