小编Mik*_*cre的帖子

覆盖python setuptools中的shebang mangling

背景

我为使用模块(https://luarocks.org/)管理软件包的系统编写了小型python 软件包。对于那些不了解它的人,可以运行module load x并运行一个小的脚本来修改各种环境变量以使软件“ x”正常工作,然后可以使用撤消该操作module unload x

这种软件管理方法在科学计算中几乎无处不在,并且在该领域具有很大的价值:您可以将古老的未维护软件与该软件可能会干扰的软件包一起运行,可以运行多个版本的软件,从而使自己的产品再现。准确地记录数据(您可以返回到旧版本),并且可以运行具有过时依赖关系的坦率地编写未更新的软件。

这些功能很棒,但是它们在python 2/3 split中造成了问题:

如果您想编写一个同时适用于python 2和3 的软件包并将其与需要 python 2或3的软件一起使用怎么办?

使旧的python2依赖软件在这些大型系统上工作的方式是,您制作了python / 2.7.x模块和python / 3.5模块。当您要运行使用python 2的脚本时,请加载该模块等。

但是,我想编写一个可以在两种环境下都可以使用的python软件包,因为无论使用哪种python解释器,我都希望该软件处于活动状态。

从根本上讲,这非常容易:只需使用#!/usr/bin/env pythonshebang线就可以了。这样可行。我编写了所有软件都可以使用,所以没有问题。

问题是:我想使用setuptools将我的软件包分发给处于相同情况的其他科学家,而setup工具会破坏shebang线。

我不想就修改shebang线是否是一个好主意展开辩论,我相信这是因为它已经在同一状态下存在多年了。老实说,我不在乎,这对我不起作用。默认的setuptools安装会导致软件无法运行,因为当未加载python解释器的模块时,该python解释器将无法运行,这PYTHONPATH是完全错误的。

如果我所有的用户都具有root用户访问权限,则可以使用该data_files选项将脚本复制到/usr/bin,但这对兼容性不是一个好主意,而且我的用户也没有root用户访问权限,因此这是一个有争议的问题。

到目前为止,我尝试过的事情:

我尝试设置sys.executable/usr/bin/env pythonsetup.py文件,但不起作用,因为那时家当是:#!"/usr/bin/env python",这显然是行不通的。

我在以下问题中尝试了“不要触碰我的shebang类”想法:不要触碰我的shebang!(这是最低的答案,票数为0)。那也不起作用,可能是因为它是为distutils而不是setuptools编写的。再加上这个问题已有6年历史了。

我还看了这些问题:

Setuptools entry_points / console_scripts在shebang中具有特定的Python版本

更改用于包装的console_script入口点解释器

那里描述的方法不起作用,shebang线仍被更改。

创建一个setup.cfg包含以下内容的文件:

[build]
executable = /usr/bin/env python
Run Code Online (Sandbox Code Playgroud)

也不会改变shebang行的行为。 …

python linux setuptools

6
推荐指数
1
解决办法
966
查看次数

在蛇make中将基于动态输出的其他文件与混合的非动态通配符一起使用

我正在尝试使用执行以下操作的Snakefile:

rule split_files:
    input:
        '{pop}.bam'
    output:
        dynamic('{pop}_split/{chrom}.sam')
    shell:
        "something"

rule work:
    input:
        sam='{pop}_split/{chrom}.sam',
        snps='snps/{chrom}_snps'
    output:
        '{pop}_split/{chrom}_parsed.sam'
    shell:
        "something"

rule combine:
    input:
        dynamic('{pop}_split/{chrom}_parsed.sam')
    output:
        '{pop}_merged.sam'
    shell:
        "something"
Run Code Online (Sandbox Code Playgroud)

这导致错误:

Missing input files for rule work:
snps/__snakemake_dynamic___snps
Run Code Online (Sandbox Code Playgroud)

dynamic工作规则的两个输入相加会导致相同的错误。

我需要执行此操作,因为某些种群有chrY,而其他种群则没有,所以我不能仅仅通过染色体列表进行扩展(实际上我可以在当前正在使用的其他方法上进行扩增,但是这样做很麻烦)。

snakemake

5
推荐指数
0
解决办法
93
查看次数

cython:减少类的大小,减少内存使用,提高速度

我有一个相对简单的问题:给定基因组中的位置,返回该点的基因名称。

我现在解决这个问题的方法是在 cython: 中使用以下类:

class BedFile():
    """ A Lookup Object """
    def __init__(self, bedfile):
        self.dict = {}
        cdef int start, end
        with open(bedfile) as infile:
            for line in infile:
                f = line.rstrip().split('\t')
                if len(f) < 4:
                    continue
                chr   = f[0]
                start = int(f[1])
                end   = int(f[2])
                gene  = f[3]
                if chr not in self.dict:
                    self.dict[chr] = {}
                self.dict[chr][gene] = (start, end)

    def lookup(self, chromosome, location):
        """ Lookup your gene. Returns the gene name """
        cdef int l
        l = int(location) …
Run Code Online (Sandbox Code Playgroud)

c python cython python-3.x

4
推荐指数
1
解决办法
1885
查看次数

Cython:C++ 在字典中使用向量?

我正在使用以下代码尝试使用 C++ 向量:

from libcpp.vector cimport vector                                                                                                                                         

cdef struct StartEnd:
    long start, end 

cdef vector[StartEnd] vect
print(type(vect))
cdef int i
cdef StartEnd j
k = {}
k['hi'] = vect
for i in range(10):
    j.start = i 
    j.end = i + 2 
    k['hi'].push_back(j)
for i in range(10):
    print(k['hi'][i])
Run Code Online (Sandbox Code Playgroud)

这里的确切功能并不重要,这只是一个虚拟程序。问题是运行它会产生错误:AttributeError: 'list' object has no attribute 'push_back'如果没有字典,这会起作用,但我认为字典对于我的用例是必要的。有没有办法使这项工作?

我不想来回复制向量,因为这些向量将达到数千万个条目的长度。也许我可以存储指向向量的指针?

c++ python cython

4
推荐指数
1
解决办法
1242
查看次数

Python Pandas:不能做切片索引

我正在尝试使用看起来像这样的pandas multiindex数据框:

                   end ref|alt
chrom start
chr1  3000714  3000715     T|G
      3001065  3001066     G|T
      3001110  3001111     G|C
      3001131  3001132     G|A
Run Code Online (Sandbox Code Playgroud)

我希望能够这样做:

df.loc[('chr1', slice(3000714, 3001110))]
Run Code Online (Sandbox Code Playgroud)

失败并出现以下错误:

不能用这些索引器[1204741]进行切片索引

df.index.levels[1].dtype返回dtype('int64'),所以应该使用整数切片吗?

此外,任何关于如何有效地执行此操作的评论都是有价值的,因为数据框有1200万行,我需要使用这种切片查询查询约7000万次.

python multi-index dataframe pandas

3
推荐指数
1
解决办法
3941
查看次数

标签 统计

python ×4

cython ×2

c ×1

c++ ×1

dataframe ×1

linux ×1

multi-index ×1

pandas ×1

python-3.x ×1

setuptools ×1

snakemake ×1