subprocess.call()的权限被拒绝错误

时间:2018-02-09 05:44:25

标签: python jupyter-notebook

我试图将一些nrrd文件转换为Dicom文件,我有这个代码片段

NRRD_TO_DICOM = '/mnt/sdc1/user/6363/'
def NRRDToDICOM(filename, output_folder_name):
    subprocess.call([NRRD_TO_DICOM, filename, output_folder_name])

NRRDToDICOM('ARTERIAL.nrrd', '/mnt/sdc1/user/6363/ARTERIAL/')

我试过从我的jupyter笔记本中运行它,但它给了我

 PermissionError                           

Traceback (most recent call last)
<ipython-input-6-5ee279d7c7db> in <module>()
      3     subprocess.call([NRRD_TO_DICOM, filename, output_folder_name])
      4 
----> 5 NRRDToDICOM('ARTERIAL.nrrd', '/mnt/sdc1/Ryan/6363/ARTERIAL/')

<ipython-input-6-5ee279d7c7db> in NRRDToDICOM(filename, output_folder_name)
      1 NRRD_TO_DICOM = '/mnt/sdc1/Ryan/6363/'
      2 def NRRDToDICOM(filename, output_folder_name):
----> 3     subprocess.call([NRRD_TO_DICOM, filename, output_folder_name])
      4 
      5 NRRDToDICOM('ARTERIAL.nrrd', '/mnt/sdc1/Ryan/6363/ARTERIAL/')

PermissionError: [Errno 13] Permission denied

之后我将保存的文件保存为py文件,然后在完成后从终端运行

chmod +x /mnt/sdc1/user/6363/ARTERIAL/

chmod +x /mnt/sdc1/user/6363/

但同样的错误仍然存​​在, 关于如何解决这个问题的任何建议都会非常有用,在此先感谢。

2 个答案:

答案 0 :(得分:1)

您正在尝试运行/mnt/sdc1/user/6363/作为命令的名称,但很明显,它不是一个。

目前还不清楚你试图实际运行的是什么,但这根本不是正确的方法。

作为subprocess.Popen()的第一个参数传递的列表中的第一个项及其各种便利包装器需要是一个可执行的文件,就像您需要键入命令一样,而不是一个目录名,在shell提示符下。

我猜你的代码应该看起来像

def NRRDToDICOM(filename, output_folder_name):
    subprocess.call(['/usr/bin/nrrdtodicom', filename, output_folder_name])

如果可执行文件的路径已经在PATH上,那么可执行文件的路径可能没有必要(因为它应该是 - 我主要放在/usr/bin/中,以使我们真正明白我们正在谈论关于那种类型的东西),你当然可以把它保存在一个变量中,如果你绝对坚持,但这似乎是一个奇怪的事情要在这里(虽然如果一个命令与所需的API可以安装在许多不同的名称下或许那么让它可配置或至少容易改变是有意义的。

答案 1 :(得分:0)

使用-R递归每个级别目录:

chmod +x -R /mnt/sdc1/user/6363/ARTERIAL/