Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在目录副本后找不到文件_Python_Linux_Systemd - Fatal编程技术网

Python 在目录副本后找不到文件

Python 在目录副本后找不到文件,python,linux,systemd,Python,Linux,Systemd,我正在尝试使用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' \

我正在尝试使用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
时,我收到以下错误:

    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
?还是关于特权


谢谢你的帮助

当您尝试将open(“FBatch”、“r”)作为f:打开时,它不会尝试在
/usr/local/bin/ProcessManager
中打开文件,因为它不是当前工作目录。相反,它会尝试在其他地方打开它。在这种情况下,它试图打开根目录中的文件
/


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

当您尝试将open(“FBatch”,“r”)作为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'
另外,如果您不希望脚本在重新启动后仍然有效,您可以使用库来启动临时单元

import pystemd.run

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

平心而论,您可以使用systemd run命令行工具执行相同的操作,因为每个人都已经指出了当前工作路径的问题,您可以使用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'
另外,如果您不希望脚本在重新启动后仍然有效,您可以使用库来启动临时单元

import pystemd.run

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

平心而论,您可以使用systemd run命令行工具执行同样的操作

您确定工作目录是
/usr/local/bin/ProcessManager
<用open(“FBatch”,“r”)作为f:的code>将尝试在当前工作目录中打开一个文件。我想是的,因为我的命令exec是
ExecStart=/usr/bin/python/usr/local/bin/ProcessManager/gobatch.py
。我错了吗?我建议将完整路径放入文件名的参数中,或者使用
print(os.cwd())
进行调试。我遇到一个错误:
AttributeError:“module”对象没有属性“cwd”
。与
os.pwd
的结果相同。当我打印os.system('pwd')时,除了错误之外,什么都没有发生。。。文件直接用nano更新。对不起,它是
os.getcwd()
;我的错误您确定工作目录是
/usr/local/bin/ProcessManager
<用open(“FBatch”,“r”)作为f:的code>将尝试在当前工作目录中打开一个文件。我想是的,因为我的命令exec是
ExecStart=/usr/bin/python/usr/local/bin/ProcessManager/gobatch.py
。我错了吗?我建议将完整路径放入文件名的参数中,或者使用
print(os.cwd())
进行调试。我遇到一个错误:
AttributeError:“module”对象没有属性“cwd”
。与
os.pwd
的结果相同。当我打印os.system('pwd')时,除了错误之外,什么都没有发生。。。文件直接用nano更新。对不起,它是
os.getcwd()
;我的脚本开头的错误使用了os.chdir(/usr/local/bin/ProcessManager),似乎可以正常工作!谢谢你!在我的脚本的开头使用
os.chdir(/usr/local/bin/ProcessManager
)似乎很有效!谢谢你!