我正在尝试运行一个旧脚本,该脚本需要一个.mdb文件并将其转换为MySQL数据库。但是,我遇到一个问题,收到以下错误。
File "/usr/lib64/python2.7/subprocess.py", line 568, in check_output
process = Popen(stdout=PIPE, *popenargs, **kwargs)
File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__
errread, errwrite)
File "/usr/lib64/python2.7/subprocess.py", line 1327, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
我尝试研究此错误,但我发现的所有问题仅是修复了未正确设置为列表格式的项目的问题。因此,我已经修改了调用subprocess.py的受影响代码,并将其更改为以下代码:
def get_external_command_output(command):
args = shlex.split(command)
print "################"
print type(args), args
ret = subprocess.check_output(args) # this needs Python 2.7 or higher
return ret
依次返回相同的错误,但还会显示以下消息:
<type 'list'> ['mdb-tables', '-1', '/mnt/data/General/Genit/WIP/IL_Orders.mdb']
所以我可以放心地说,参数已正确设置为列表格式。我真的不确定如何解决这个问题,因为我发现的所有帮助论坛都提出了同样的问题。该参数不是列表。但是,我可以看到我的存在。
有人可以在这里提供一些指导吗? 非常感谢。
答案 0 :(得分:0)
可能有很多原因。该错误来自您的基础操作系统(ENOENT
)。
最简单的方法是尝试运行同一件事:
mdb-tables -1 /mnt/data/General/Genit/WIP/IL_Orders.mdb
(或者实际上只是mdb-tables
),看看会发生什么,以及从shell中收到什么抱怨。
可能的原因是:
如Peter Wood在评论中所述。如果您只是传递一个可执行文件名称来运行,它必须位于PATH
环境变量中列出的目录之一中。或者,您必须使用可执行文件的绝对路径或相对于当前工作目录的路径(基于您运行父文件的位置或传递给cwd
调用的subprocess.check_output
参数)。例如。 ./mdb-tables
(如果与运行父脚本时所在的目录位于同一目录中或设置了cwd
)。
这也是可能的。 Esp。如果是较旧的脚本。您指定的解释器在主机上不再存在。在这种情况下,将引发相同的错误(ENOENT
)。如果直接从shell执行,则可能会看到略有不同的错误消息(提示解释器错误),但是当从python调用为子进程时,错误消息看起来是相同的。
您已经暗示mdb-tables
也是一个脚本。但是否则,上一段对于动态链接的ELF二进制文件也适用。如果它们是用动态链接器(其解释器)的版本构建并期望其版本(路径)在系统上不再可用。例如,您可以通过运行objdump -sj .interp BINARY_IN_QUESTION
打印期望的动态链接程序二进制文件的路径。