Python subprocess.call()报错"no such file or directory"

16

我在模块的几个问题上找到了一些解答,但更普遍的问题似乎是正确地获取参数列表,我认为我已经成功解决了这个问题(最终)。

我正在尝试运行一个需要在命令行中输入以下内容的程序,

fits2ndf in out

使用Subprocess,其中'in'是要转换的文件路径,'out'是保存结果的路径和文件名。

subprocess.call(["fits2ndf","/media/tom_hdd/Transfer/reference.fits","/media/tom_hdd/Transfer/reference.sdf"])

这会引发一个异常,

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/subprocess.py", line 493, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory

设置shell=TRUE(我知道这是不好的)会产生相同的结果。不确定是否相关,但我正在使用tcsh。有什么建议吗?


回答问题时的编辑:

我尚未永久设置路径,但fits2ndf是我使用以下命令初始化的程序包的一部分:

% tcsh
% setenv STARLINK_DIR  /home/tomq/star-kapuahi
% source $STARLINK_DIR/etc/login
% source $STARLINK_DIR/etc/cshrc

通常情况下,无需指定完整路径即可在任何目录中使用。


你的路径中是否包含 fits2ndf - Karthik T
抱歉,我不太明白你的问题。fits2ndf包含在另一个目录中,但在其他地方没有完整路径也可以正常运行,但它不应该是.fits文件路径的一部分。 - user1889259
1
@Karthik 是在提到你的 PATH 环境变量。fits2ndf所在的目录是否在你的 $PATH 中,并且 PATH 是否已经导出? - cdarke
如果您提供fits2ndf的完整路径,就可以了。例如:/home/foo/fits2ndf - denizeren
好的,是时候承认我对Unix非常陌生,只能通过跟随教程和提问来解决问题。fits2ndf几乎肯定不在我的路径中。问题已编辑,因为我无法在这里正确格式化代码? - user1889259
2个回答

14

which fits2ndf 将显示 fits2ndf 的路径。

然后,您可以将完整路径写入代码中,它应该会起作用。

例如:

~$ which mv
/bin/mv

我的Python代码:

import subprocess

subprocess.call(["/bin/mv","/tmp/a","/tmp/b"])

3
谢谢,这个方法起作用了。有没有办法让我不必每次都指定fits2ndf的完整路径?实际上最好能够在不需要路径的情况下使用该文件夹中的任何程序。否则会变得很混乱。 - user1889259
你可以从 os.environ['PATH'] 获取系统的 PATH 并进行修改,然后将其作为 env 关键字参数传递给 subprocess。请注意,env 需要一个字典;你可以复制所有的 os.environ 并在副本中修改 PATH,但通常你运行的子进程不需要设置环境中的其他内容,因此只创建一个仅包含 PATH 成员的新字典即可。 - tripleee

0

你可能想要移除 "/media/tom_hdd/Transfer/reference.sdf" 中的空格。

另外,尝试将所有内容放在一个字符串中,例如 "fits2ndf /media/tom_hdd/Transfer/reference.fits /media/tom_hdd/Transfer/reference.sdf"

确保你指向了正确的路径。


好的,谢谢。不幸的是,这只出现在写这个问题时,而不是在代码中,所以它没有改变任何东西。 - user1889259

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接