在主机外部编写时,Python脚本不会执行

时间:2014-12-14 09:38:30

标签: python linux ubuntu

我的最终问题是双重的:

  1. 每当我尝试按./foo.py方法执行python脚本时,我都会得到: No such file or directory。但是,我可以执行python foo.py
  2. 当我无法使用./foo.py执行python脚本时我无法使用Apache2 / CGI访问它(请注意,如果我在RaspberryPi中编写并保存脚本,我可以使用它,即,当我将其保存到/ usr / lib / cgi-bin /我可以从Web浏览器访问它(在这种情况下,我更改foo.py以打印相应的html标头))
  3. 在所有情况下,foo.py都是可执行的,用户所有者是root。

    foo.py =

    #!/usr/bin/env python
    
    print("foo")
    

    什么有效:

    1. 我在RaspberryPi(和Ubuntu)中打开一个文本编辑器并创建foo.py(注意我使用RaspberryPi的Debian和一个用于交叉引用/故障排除的serperate Ubunutu 14.04)
    2. 我可以在执行可执行文件后使用./foo.py执行foo.py.
    3. 什么行不通(第1部分):

      1. 我在Windows8.1上编写相同的脚本,将其保存到文档文件夹
      2. 我将脚本保存到共享网络驱动器/ home/pi(我使用Samba。下面是smd.config)
      3. 在RaspberryPi(或Ubuntu)上,我使脚本可执行
      4. 每当我尝试按./foo.py方法执行python脚本时,我都会得到: No such file or directory。但是,我可以执行python foo.py
      5. 什么行不通(第2部分):

        1. 我在Windows8.1上编写相同的脚本并将其保存到文档文件夹
        2. 我打开FileZilla并将脚本sftp到RaspberryPi(和Ubuntu)目的地为/home/pi
        3. 每当我尝试按./foo.py方法执行python脚本时,我都会得到: No such file or directory。但是,我可以执行python foo.py
        4. 什么行不通(第3部分):

          1. 我在Windows8.1上编写相同的脚本并将其保存到文档文件夹
          2. 我写了一个批处理文件,将putty副本(pscp.exe)脚本发送到目标/home/pi并使其可执行(我在Pi端仔细检查)
          3. 每当我尝试按./foo.py方法执行python脚本时,我都会得到: No such file or directory。但是,我可以执行python foo.py
          4. 总之,当我在主机本身内工作时,所有脚本都很乐意执行。但是,当我想从我的Windows8.1开始工作并通过我所说的3种方法发送时,脚本会生气,不会执行./

            Samba配置(smdb.config)

            [homes]
               comment = Home Directories
               browseable = yes
               create mask = 0777
               directory mask = 0777
               valid users = %S
            
            [SnoopPi]
               comment= Pi Home
               path = /home/pi
               browseable=yes
               writeable=Yes
               only guest=no
               create mask=0777
               directory mask=0777
               public=no
               read only=no
               force user=root
            

2 个答案:

答案 0 :(得分:2)

可能问题在于行尾。当您在“另一台计算机”上创建脚本时(可能是在Windows上),脚本会获得windows line-endings(“\ r \ n”)。当您尝试在Linux主机上执行它们时,系统无法找到第一行中提到的解释器“/ usr / bin / python \ r \ n”(很明显)。

我建议您通过运行类似perl -pi -e 's,\r\n,\n' script.py

的内容来过滤掉所有Windows EOL

答案 1 :(得分:0)

感谢PM 2Ring

问题确实存在于"隐形" Windows添加的行结尾。解决方案是从[sourceforge]下载(免费)dos2unix / unix2dos文本文件格式转换器。我在命令提示符1

中执行了<Path>\dos2unix.exe foo.py