无法打开文件:[Errno 2]没有那个文件或目录。

4
当子进程调用新的newtest.py进程时,我遇到了以下错误。代码作为守护进程运行。当我启动守护进程时,该进程被调用,它可以正常工作并运行8个进程,但在开始出现错误后,每次调用都会出现错误。该错误如下:
  /opt/local/Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/MacOS/Python: can't open file 'newtest.py': [Errno 2] No such file or directory

以下是代码:

for index,row in enumerate(jobs):
            if index <= new_jobs :
                dirs=row[0]
                dirName=os.path.join(homeFolder,dirs)
                logFile=os.path.join(dirName,(dirs+".log"))
                proc=subprocess.Popen(["/opt/local/bin/python2.6","newtest.py",dirs],stdout=open(logFile,'a',0),stderr=open(logFile,'a',0))
                proId= proc.pid

我尝试使用newtest.py的完整路径,但仍然出现相同的错误。有什么建议吗?非常感谢!


如果您提供完整路径,那么确切的错误消息是什么? - rocksportrocker
文件 'newtest.py': [Errno 2] 没有那个文件或目录" 看起来非常清楚。你对这条消息感到困惑吗?文件不存在。你还需要知道什么?"尝试使用 newtest.py 的完整路径"? 请包括实际的当前工作目录和此 "完整路径" 信息。使用 os.getcwd 打印当前工作目录,并使用 os.listdir 证明 文件确实存在于你所声称的位置。 - S.Lott
它与newtest.py之前的路径完全相同。 - shash
@shash: "与 newtest.py 之前的路径完全相同"。这不是代码,也不是证据。这只是一个说法。请提供证据。请打印 os.getcwd 等的值来证明文件确实存在于你声称的位置。 - S.Lott
@S.Lott. 当我在newtest.py之前提到完整路径时,它确实可以工作。但是我认为由于脚本在当前目录中,我的代码应该能够运行脚本。最初在没有提及完整路径的情况下它确实可以工作。 - shash
显示剩余2条评论
2个回答

1

尝试:

subprocess.Popen(['/opt/local/bin/python2.6','/FULL/PATH/TO/FILE/newtest.py'],stdout=subprocess.PIPE)

这个可行吗?移除了参数和其他的东西。

另外,你能做一个:

f = open('/FULL/PATH/newtest.py')
print f

0

我不记得在Linux系统上是否曾受到过这个影响,但是在MacOS上我遇到了同样的错误。

我认为我已经解决了它;你应该切换到你分叉进程所在的目录。我在类似于/Users/me/dev/project/的地方运行bin/my-daemon start

在代码中,在daemonize方法的顶部,我调用cwd = os.getcwd()将其赋值给一个变量,然后在分叉中调用os.chdir(cwd)

已经过去半个多小时了,通常守护进程会在此时引发No such file or directory错误,但现在还没有出现。 如果您的pid文件使用绝对路径(/var/run/my.pid),则可能不会出现此问题,但由于我可能没有写入权限并且用户可能指定要在哪里写入它,因此我将其相对于我的项目使用。

编辑:刚刚意识到这个问题有多老,而且OP的代码可能涉及不同的问题。这是我正在使用的稍微修改过的守护进程代码:

https://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/

我真心希望这个答案能够帮助到某个人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接