繁体   English   中英

目录复制后找不到文件

[英]File not found after a directory copy

我正在尝试使用Python创建安装脚本,以使用systemd创建守护程序。

安装脚本摘录:

....
# Copy ProcessManager directory into /usr/local/bin/
print('Copy sources into /usr/local/bin')
os.system('cp -r ' + processManagerPath + ' /usr/local/bin')

fileContent =   '[Unit] \n' \
                'Description=ProcessManager \n' \
                'After=tlp-init.service \n\n' \
                '[Service] \n' \
                'Type=oneshot \n' \
                'RemainAfterExit=no \n' \
                'ExecStart=/usr/bin/python /usr/local/bin/ProcessManager/gobatch.py \n\n' \
                '[Install] \n' \
                'WantedBy=multi-user.target'

file = open('/etc/systemd/system/processManager.service', 'w')
file.write(fileContent)
file.close()
....

但是,当我使用以下sudo systemctl status processManager.service启动守护程序时: sudo systemctl status processManager.service以下错误:

    stringToSend = convertFileToString()
  File "/usr/local/bin/ProcessManager/gobatch.py", line 23, in convertFileToString
    fbatchContent = readFile()
  File "/usr/local/bin/ProcessManager/gobatch.py", line 13, in readFile
    with open("FBatch", "r") as f:
IOError: [Errno 2] No such file or directory: 'FBatch'

当我列出/usr/local/bin/ProcessManager ,内容为:

FBatch  findCommand.py  gobatch.py  install.py  Programs.md  UpdateFBatchFile.py

存在关于cp -r我不知道的东西吗? 或关于特权?

感谢帮助!

当尝试with open("FBatch", "r") as f: ,它将不会尝试在/usr/local/bin/ProcessManager打开文件,因为它不是当前工作目录。 相反,它将尝试在其他位置打开它。 在这种情况下,它尝试打开根目录/的文件。

您将必须为所有open呼叫提供完整路径,或者一次使用os.chdir(path)更改当前工作目录。

正如大家已经指出的那样,问题在于当前的工作路径,您可以在python脚本中使用os.chdir来解决,或者可以在单位文件中指定WorkingDirectory ,如下所示:

fileContent =   '[Unit] \n' \
            'Description=ProcessManager \n' \
            'After=tlp-init.service \n\n' \
            '[Service] \n' \
            'Type=oneshot \n' \
            'WorkingDirectory=/usr/local/bin/ProcessManager\n' \
            'RemainAfterExit=no \n' \
            'ExecStart=/usr/bin/python /usr/local/bin/ProcessManager/gobatch.py \n\n' \
            '[Install] \n' \
            'WantedBy=multi-user.target'

另外,如果您不希望脚本在重启后仍然存活,则可以使用pystemd库来启动瞬态单元。

import pystemd.run

pystemd.run([b'/usr/bin/python', b'/usr/local/bin/ProcessManager/gobatch.py'], cwd=b'/usr/local/bin/ProcessManager')

公平地说,您可以使用systemd-run命令行工具执行相同操作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM