我有一个要在目录中的每个文件上运行的模块。但是,当我使用每个文件作为输入遍历该目录时,模块找不到该文件,好像循环中定义的变量实际上并未指向该文件。这是我要执行的代码:
import os as os
for file in os.listdir():
if file.endswith('.fasta'):
!python ../iupred2a.py file long
任何帮助将不胜感激。谢谢!
答案 0 :(得分:1)
https://ipython.readthedocs.io/en/stable/interactive/reference.html#system-shell-access说,shell命令(例如,以“!”为前缀的行)是按字面意义解释的。当您键入“文件”时,它会看到“文件”,而不是file
变量的值。
任何以!开头的输入行字符逐字传递(当然要减去!)到底层操作系统。
但是它也说您可以使用花括号或美元符号来“扩展”一个值。
IPython还允许您在进行系统调用时扩展python变量的值。将变量或表达式包装在{大括号}中:
In [1]: pyvar = 'Hello world'
In [2]: !echo "A python variable: {pyvar}"
A python variable: Hello world
In [3]: import math
In [4]: x = 8
In [5]: !echo {math.factorial(x)}
40320
对于简单的情况,您可以在$前面加上变量名:
In [6]: !echo $sys.argv
[/home/fperez/usr/bin/ipython]
In [7]: !echo "A system variable: $$HOME" # Use $$ for literal $
A system variable: /home/fperez
根据您的情况,尝试使用!python ../iupred2a.py $file long
或!python ../iupred2a.py {file} long
。
...总而言之,我认为最好import
您的另一个Python文件并直接调用其函数。这可能需要进行一些重新设计,因为importing from a file from one directory up有点棘手,并且模块的命令行界面通常不同于其编程界面。
如果您可以将当前文件和iupred2a.py放入同一目录中,并弄清楚您实际要调用的函数的名称,那么您的代码最终将看起来像这样:
import os
import iupred2a as iup
for file in os.listdir():
if file.endswith('.fasta'):
iup.do_the_thing(file, mode="long")