Python 在目录副本后找不到文件
我正在尝试使用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' \
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
)似乎很有效!谢谢你!