【问题标题】:Linux run shell cmd from python, Failed to load config fileLinux从python运行shell cmd,无法加载配置文件
【发布时间】:2016-12-28 14:22:28
【问题描述】:

我在运行 Debian 的树莓派上安装了一个名为 rclone 的备份程序,我已经成功地在 shell 中运行了 cmd 以将文件夹备份到谷歌驱动器,但我真的需要每次都能够这样做一张我的 python 脚本的照片,与其他人相比,我在 Linux 方面的经验很少,我想如果我制作一个带有基本 shebang 的 shell 脚本

 #!/bin/sh 

 #!/bin/bash 

然后是下面的cmd

rclone copy /var/www/html/camera_images pictures::folder1

然后我使 .sh 文件成为可执行文件,如果我只是在文件夹中单击它并执行,但如果我尝试从 python 调用该 .sh 脚本,则可以使用

os.system('sh /home/pi/py/upload.sh')

os.system(' rclone copy /var/www/html/camera_images pictures::folder1 ')

我在 shell 中收到错误提示

Failed to load config file "/root/.rclone.conf" using default - no such directory.

但 .conf 应该位于 /home/pi 中。如果我尝试

os.system(' sh rclone copy /var/www/html/camera_images pictures::folder1 ')

我明白了

sh: 0: Cant open rclone.

如何从 python 运行复制 cmd 或脚本?

这就是我安装 rclone 的方式

  1. cd

  2. wget http://downloads.rclone.org/rclone-v1.34-linux-arm.zip

  3. 解压rclone-v1.34-linux-arm.zip

  4. cd rclone-v1.34-linux-arm

  5. sudo cp rclone /usr/sbin/

  6. sudo chown root:root /usr/sbin/rclone

  7. sudo chmod 755 /usr/sbin/rclone

  8. sudo mkdir -p /usr/local/share/man/man1

  9. sudo cp rclone.1 /usr/local/share/man/man1/

  10. sudo mandb

  11. rclone 配置

【问题讨论】:

  • 确保您的 rclone 程序在您的系统路径中
  • 包含 rclone.exe 的 rclone 文件夹应该在我的根目录 /home/pi 中,我可以打开 shell 并键入 cmd rclone copy /var/www/html/ camera_images pictures::folder1 即使我改变目录它也能工作。
  • 好的,去掉sh前缀告诉我们
  • k 1 分钟我现在才加载它
  • 我尝试了 os.system('/home/pi/py/upload.sh') 和 os.system('rclone copy /var/www/html/camera_images pictures::folder1')我都给出相同的消息,无法加载配置文件“/root/.config.conf” - 使用默认值:打开/root/.rclone.conf:没有这样的目录。

标签: python linux bash shell


【解决方案1】:

在你的 rclone 命令中使用 --config

来自文档: --config 字符串 配置文件。 (默认 /home/ncw/.rclone.conf")

您的命令应如下所示: os.system(' sh rclone copy --config /home/pi/.rclone.conf /var/www/html/camera_images pictures::folder1 ')

【讨论】:

    【解决方案2】:

    您应该使用subprocess 模块而不是os.system

    您可以使用subprocess.Popen 创建一个进程并为其指定一个工作目录。

    subprocess.Popen(your_command, cwd=path_to_your_executable_dir, shell=True)
    

    (使用shell=True 传递一个简单的字符串命令以及其他便利)。

    shell 参数(默认为 False)指定是否使用 shell 作为要执行的程序。如果 shell 为 True,则为 建议将 args 作为字符串而不是序列传递。

    在 shell=True 的 Unix 上,shell 默认为 /bin/sh。如果 args 是 string,字符串指定要通过shell执行的命令。 这意味着字符串必须完全按照它的格式进行格式化 在 shell 提示符下键入时。这包括,例如,引用或 反斜杠转义带有空格的文件名。如果 args 是 序列,第一项指定命令字符串,任何 附加项将被视为 shell 的附加参数 本身。也就是说,Popen 相当于: ....

    【讨论】:

      【解决方案3】:

      谢谢大家:)

      我现在正在使用它

      os.system(' rclone copy --config /home/pi/.rclone.conf /var/www/html/camera_images pictures::folder1 ')
      

      请注意,如果我将 sh 放在开头,我会收到错误 sh: 0: Can't open rclone 虽然我昨天读到关于将 ,:0 之类的东西作为返回值放在末尾?无论哪种方式,它都可以在没有 sh 的情况下工作。

      子进程也可以工作,我将使用它来代替。

      subprocess.Popen('rclone copy --config /home/pi/.rclone.conf /var/www/html/camera_images pictures::folder1', shell=True)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-15
        • 1970-01-01
        • 1970-01-01
        • 2015-05-14
        • 2012-03-30
        • 1970-01-01
        • 2021-04-16
        • 2013-05-08
        相关资源
        最近更新 更多