我为使用模块(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 python中setup.py文件,但不起作用,因为那时家当是:#!"/usr/bin/env python",这显然是行不通的。
我在以下问题中尝试了“不要触碰我的shebang类”想法:不要触碰我的shebang!(这是最低的答案,票数为0)。那也不起作用,可能是因为它是为distutils而不是setuptools编写的。再加上这个问题已有6年历史了。
我还看了这些问题:
Setuptools entry_points / console_scripts在shebang中具有特定的Python版本
那里描述的方法不起作用,shebang线仍被更改。
创建一个setup.cfg包含以下内容的文件:
[build]
executable = /usr/bin/env python
Run Code Online (Sandbox Code Playgroud)
也不会改变shebang行的行为。 …
我正在尝试使用执行以下操作的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,而其他种群则没有,所以我不能仅仅通过染色体列表进行扩展(实际上我可以在当前正在使用的其他方法上进行扩增,但是这样做很麻烦)。
我有一个相对简单的问题:给定基因组中的位置,返回该点的基因名称。
我现在解决这个问题的方法是在 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++ 向量:
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'如果没有字典,这会起作用,但我认为字典对于我的用例是必要的。有没有办法使这项工作?
我不想来回复制向量,因为这些向量将达到数千万个条目的长度。也许我可以存储指向向量的指针?
我正在尝试使用看起来像这样的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 ×4
cython ×2
c ×1
c++ ×1
dataframe ×1
linux ×1
multi-index ×1
pandas ×1
python-3.x ×1
setuptools ×1
snakemake ×1